我的SSE2地板功能有一些问题

时间:2013-05-08 18:00:20

标签: c++ optimization sse

所以我使用SSE2编写了一个函数来放置一个向量,但它似乎只能用于某些目的,例如它适用于我的双线性滤波算法但是当用于执行模数时它会出现略微的值关闭。该函数通过使用截断执行到整数向量的转换并将其转换回浮点来工作。楼层和模数代码都列在下面:

inline __m128 floor_SIMD(const __m128 & a)
{
    __m128i int_val = _mm_cvttps_epi32(a);
    return _mm_cvtepi32_ps(int_val); 
}

inline __m128 mod_SIMD(const __m128 & x, const __m128 & y)
{
    return _mm_sub_ps(x, _mm_mul_ps(y, floor_SIMD(_mm_div_ps(x, y))));
}

可能有人解释为什么我从我的模数中得到略微奇怪的值?

编辑:例如,当使用mod_SIMD(_mm_set1_ps(63.6f),_ mm_set1_ps(32.0f))时,它会产生错误的答案,但mod_SIMD(_mm_set1_ps(23.6f),_ mm_set1_ps(32.0f))将产生正确的答案。当我使用效率低得多的组件版本替换地板功能时,它可以正常工作。

1 个答案:

答案 0 :(得分:3)

我解决了自己的问题。为了每个人的利益,这是我的结果代码。如果它大于补偿截断问题的原始值

,它会从值中减去一个值
inline __m128 floor_SIMD(const __m128 & a)
{
    static const __m128 one = _mm_set1_ps(1.0f);

    __m128 fval = _mm_cvtepi32_ps(_mm_cvttps_epi32(a));

    return _mm_sub_ps(fval, _mm_and_ps(_mm_cmplt_ps(a, fval), one));
}