3

我正在尝试使用 SSE 内在函数编写等效的 if 语句。

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

感谢您的关注。

4

1 回答 1

17

您正在比较得到 a1或 a 0,然后乘以另一个数字。本质上是这样的:

c = (a < b) * d;

这与此相同:

c = 0;
if (a < b)
    c = d;

这也称为有条件的移动。

如果这就是你想要的,那么你不需要01。只需将比较的结果直接与您将乘以的数字进行比较。

__m128 c = _mm_cmplt_ps(a,b);
c = _mm_and_ps(c,d);

这是有效的,因为比较返回 all0或 all 1。因此,将它们与结果进行与运算会将其归零或完全保留。

它是故意这样设计的。不需要乘法。

于 2012-11-06T18:42:20.147 回答