__m128 中的 OR 元素

OR elements in __m128

我正在编写一些 SSE 代码,我想对 __m128 中的所有元素进行 OR。我可以单独获取所有值并以这种方式对它们进行 OR,但这似乎效率低下。

基本上我正在寻找的是 SPU 上可用的 orx 指令。这有点奇怪,所以没有直接的替代方法,但是有没有一种方法可以使用 SSE2 有效地做到这一点?

在我想做的代码中:

p = _mm_cmpgt_ps(p, r);
x = p[0] | p[1] | p[2] | p[3]; // spu_orx(p)

我可能做错了,我只需要重新设计代码,这样我就不会遇到这个问题,但我希望比我更有经验的人知道该怎么做!

这将 OR 所有 4 x 32 位元素放在一起:

p = _mm_or_si128(p, _mm_srli_si128(p, 8));
p = _mm_or_si128(p, _mm_srli_si128(p, 4));

元素 0 将包含最终值 - 如果需要,您可以将其提取为 int:

int result = _mm_cvtsi128_si32(p);

一些注意事项

每当您发现自己需要执行这样的水平操作时,特别是如果它是性能关键型内部循环的一部分,那么它通常可能表明您的 SIMD 实现效率低下,您可能需要重新想想吧。

另请注意,尝试逐行将 Cell SPU 代码移植到 SSE 而不查看 "big picture" 可能不会给您最好的结果。