我正在尝试用SSE内在函数编写if语句的等价物。
我正在使用__m128 _mm_cmplt_ps(__m128 a, __m128 b)
进行比较a< b,如果比较分别为真或假,则返回0xffffffff
或0x0
。我想将这些值转换为1和0.为了做到这一点,实现逻辑“和”__m128 _mm_and_ps(__m128 c , __m128 d)
是否正确,其中c
是转换的结果,{{1例如,d
?
感谢您的关注。
答案 0 :(得分:15)
您要比较获得1
或0
,然后乘以另一个数字。基本上就是这样:
c = (a < b) * d;
与此相同:
c = 0;
if (a < b)
c = d;
这也称为条件移动。
如果这是您想要的,那么您不需要0
或1
。只是和比较的结果直接与您将乘以的数字相比。
__m128 c = _mm_cmplt_ps(a,b);
c = _mm_and_ps(c,d);
这是有效的,因为比较会返回所有0
或全部1
。因此,对结果进行AND运算将使其归零,或者完全保留它。
这是故意设计的。不需要乘法。