__m128中的OR元素

时间:2015-05-28 12:26:32

标签: c x86 sse simd

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

基本上我正在寻找的是SPU上提供的orx指令。这有点奇怪,所以没有直接的选择,但有没有办法用SSE2有效地做到这一点?

在我想要的代码中:

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

我可能会犯这个错误,我只需要重新设计代码,这样我就不会遇到这个问题,但我希望有比我更多经验的人知道如何做到这一点!< / p>

1 个答案:

答案 0 :(得分:4)

这将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而不查看“大图”可能无法为您提供最佳结果。