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

Posted

技术标签:

【中文标题】SSE 比较内在 - 如何从比较中获得 1 或 0?【英文标题】:SSE Comparison Intrinsics - How to get 1 or 0 from a comparison? 【发布时间】:2012-11-06 18:22:38 【问题描述】:

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

我正在使用__m128 _mm_cmplt_ps(__m128 a, __m128 b) 进行比较a 0xffffffff 或0x0。我想将这些值转换为 1 和 0。为了做到这一点,实现逻辑“和”__m128 _mm_and_ps(__m128 c , __m128 d) 是否正确,其中c 是转换的结果,d 是,例如, 0xffffffff?

感谢您的关注。

【问题讨论】:

内在有绝对值吗? (不,d 必须是 1)逻辑右移 31 也可以。 你打算用01做什么? @AkiSuihkonen 你是什么意思?我的实现错了吗?逻辑右移是什么意思?对不起,我是菜鸟。 :) @Mysticial 我想将它们与另一个值相乘,以便根据比较进行更改。 @Mystical XY 问题的精彩示例。 +1 提出完全正确的问题以发现它 【参考方案1】:

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

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);

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

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

【讨论】:

在这个例子中,a 和 b 是 __m128,对吧?或者它们也可以是整数? @nimbus3000 不,他们不能。这些是 SIMD 指令。它们不适用于 GPR。

以上是关于SSE 比较内在 - 如何从比较中获得 1 或 0?的主要内容,如果未能解决你的问题,请参考以下文章

avx512中比较内在指令的不同语义?

修改函数以使用 SSE 内在函数

使用 SSE 进行比较和提取

将 16 字节字符串与 SSE 进行比较

使用 sse 内在函数时如何打破循环?

了解 SSE 的内在函数如何使用内存