三维向量运算SSE/SSE2优化

减小字体 增大字体作者:chaos  来源:本站整理  发布时间:2009-12-04 15:49:00
#define FP_ONE_BITS 0x3F800000
// r = 1/p
#define FP_INV(r,p)                                                   \
{                                                                           \
    int _i = 2 * FP_ONE_BITS - *(int *)&(p);                  \
    r = *(float *)&_i;                                                \
    r = r * (2.0f - (p) * r);                                       \
}
而在SSE里也提供了两条求倒数的指令rcpss/rcpps(对应的intrinsic是_mm_rcp_ss与_mm_rcp_ps),不过这两条指令求的并非是精确值,而是近似值,所以我们需要对它的结果进行逼近处理。
float __rcp<float>( const float& a ) {
    register float r;
    __m128 rcp = _mm_load_ss( &a );
    rcp = _mm_rcp_ss( rcp );
    _mm_store_ss( &r , rcp );
    /* [2 * rcpps(x) - (x * rcpps(x) * rcpps(x))] */
    r = 2.0f * r - ( a * r * r );
    return r;
}
原理一致,只不过我们还可以用_mm_rcp_ps并行求四分量的倒数。如果你还对SSE的威力有所保留,那我建议你设计一个测试单元测试一下使用除法求倒数与使用SSE求倒数,看效率到底是谁更高、高多少。当然,我自己已经测试过很多次了。

上一页  [1] [2] [3] [4] [5] [6]  下一页

  • 好的评价 如果您觉得此文章好,就请您
      100%(2)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)
   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

用户名:   验证码:

分 值:100分 85分 70分 55分 40分 25分 10分 1分

内 容:

      若文章有错误,请将右边打钩通知管理员

关于本站 - 友情连接 - 网站地图 - 我要留言