SSE比较内在化 - 如何从比较中获得1或0?

Pip*_*ppo 3 c comparison if-statement sse intrinsics

我试图用SSE内在函数编写if语句的等价物.

__m128 _mm_cmplt_ps(__m128 a, __m128 b)用来做比较a <b,这会返回0xffffffff或者0x0如果比较分别为true或false.我想将这些值转换为1和0.为了做到这一点,实现逻辑"和"是正确的,转换的结果__m128 _mm_and_ps(__m128 c , __m128 d)在哪里,例如,?cd0xffffffff

感谢您的关注.

Mys*_*ial 16

你比较得到a 1或a 0,然后再乘以另一个数字.基本上就是这样:

c = (a < b) * d;
Run Code Online (Sandbox Code Playgroud)

这与此相同:

c = 0;
if (a < b)
    c = d;
Run Code Online (Sandbox Code Playgroud)

这也称为条件移动.

如果这是你想要的,那么你不需要0或者1.只是和比较的结果直接与您将乘以的数字.

__m128 c = _mm_cmplt_ps(a,b);
c = _mm_and_ps(c,d);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为比较返回全部0或全部1.因此,对结果进行AND运算将使其归零,或者将其完全保留.

它是故意设计的.不需要乘法.