没有等同于_mm_shuffle_ps
对于整数。为了在这种情况下达到相同的效果,你可以这样做
SSE2
*pA = _mm_shuffle_epi32(_mm_unpacklo_epi32(*pA, _mm_shuffle_epi32(*pB, 0xe)),0xd8);
SSE4.1
*pA = _mm_blend_epi16(*pA, *pB, 0xf0);
or 更改为浮点域 https://stackoverflow.com/questions/13153584/mm-shuffle-ps-equivalent-for-integer-vectors-m128i像这样
*pA = _mm_castps_si128(
_mm_shuffle_ps(_mm_castsi128_ps(*pA),
_mm_castsi128_ps(*pB), _MM_SHUFFLE(3, 2, 1 ,0)));
但更改域可能会导致绕过延迟延迟 https://stackoverflow.com/questions/19543590/bypass-delays-when-switching-execution-unit-domains在某些 CPU 上。请记住,根据阿格纳的说法
旁路延迟在延迟是瓶颈的长依赖链中很重要,但是
不是吞吐量而不是延迟重要的地方。
您必须测试您的代码并查看上面哪种方法更有效。
幸运的是,在大多数 Intel/AMD CPU 上,使用通常不会受到任何惩罚shufps
大多数整数向量指令之间。阿格纳 说:
例如,我发现混合时没有延迟PADDD
and SHUFPS
[在桑迪布里奇]。
Nehalem 确实有 2 个往返延迟SHUFPS
,但即便如此,单个SHUFPS
通常仍然比多个其他指令更快。额外的指令也会带来延迟,并且会降低吞吐量。
相反(FP 数学指令之间的整数洗牌)则不那么安全:
In Agner Fog 的微架构 http://www.agner.org/optimize/microarchitecture.pdf在第 112 页的例 8.3a 中,他表明使用PSHUFD
(_mm_shuffle_epi32
) 代替SHUFPS
(_mm_shuffle_ps
)在浮点域中时会导致四个时钟周期的旁路延迟。在示例 8.3b 中,他使用 SHUFPS 来消除延迟(这在他的示例中有效)。
尼黑勒姆上实际上有五个域。纳哈勒姆 (Nahalem) 似乎受到的影响最大(纳哈勒姆 (Nahalem) 之前不存在旁路延误)。在桑迪桥,延误不太严重。在 Haswell 上更是如此。事实上,哈斯韦尔·阿格纳(Haswell Agner)表示,他发现之间没有任何延误SHUFPS
or PSHUFD
(参见第 140 页)。