尝试在 SSE 编程中使用和掩码添加 __m128

Posted

技术标签:

【中文标题】尝试在 SSE 编程中使用和掩码添加 __m128【英文标题】:Trying to add an __m128 using an and mask in SSE programming 【发布时间】:2013-04-04 10:23:36 【问题描述】:

我正在尝试使用比较操作的结果来添加到 SSE 变量。我刚刚意识到,当使用_mm_cmplt_ps 操作时,如果结果为真,它会返回一个 NAN,因为 0xffffffff 无法表示,这对我没有用:

__m128 va;
__m128 vb;
__m128 result =_mm_set1_ps(0.0f);
vb = _mm_cmplt_ps(va,vb);
result = _mm_add_ps(result,vb);  // problem is that I would like to convert vb to 1.0's and 0.0's

【问题讨论】:

如果 va 小于 vb,您是否希望对于每个组件以 1.0 结束? @fun4jimmy 是的,这就是我想要的。 【参考方案1】:

您可以将比较掩码应用于 1.0 值的向量,例如

__m128  va, vb;
__m128  vcmp = _mm_cmplt_ps(va, vb);
__m128  vresult = _mm_and_ps(_mm_set1_ps(1.0f), vcmp);

【讨论】:

我希望结果是基于比较值的 1 .0 和 0.0 的混合? temp 在被屏蔽后是 1.0s 和 0.0s 的混合,所以如果这就是你所需要的,那么可以省略最后的添加。我现在更新了上面的代码以反映这一点。

以上是关于尝试在 SSE 编程中使用和掩码添加 __m128的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSE 错误 __m128 到 *float 转换的矩阵乘法?

SSE:从 const __m128 * 转换为 const float *

SSE:我应该将洗牌掩码设置为静态变量吗?

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

__m128, SSE4 中最大绝对值的符号

SSE 比较返回 NAN 向量