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 也可以。 你打算用0
和1
做什么?
@AkiSuihkonen 你是什么意思?我的实现错了吗?逻辑右移是什么意思?对不起,我是菜鸟。 :)
@Mysticial 我想将它们与另一个值相乘,以便根据比较进行更改。
@Mystical XY 问题的精彩示例。 +1 提出完全正确的问题以发现它
【参考方案1】:
您正在比较得到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 运算会将其归零或完全保留。
它是故意这样设计的。不需要乘法。
【讨论】:
在这个例子中,a 和 b 是 __m128,对吧?或者它们也可以是整数? @nimbus3000 不,他们不能。这些是 SIMD 指令。它们不适用于 GPR。以上是关于SSE 比较内在 - 如何从比较中获得 1 或 0?的主要内容,如果未能解决你的问题,请参考以下文章