【发布时间】:2014-10-07 06:10:52
【问题描述】:
我有两个__m128is、a 和b,我想将它们洗牌,以便a 的高64 位落在dst 的低64 位和低64 位中b 位于 dst 的上 64 位。即
dst[ 0:63] = a[64:127]
dst[64:127] = b[0:63]
相当于:
__m128i dst = _mm_unpacklo_epi64(_mm_srli_si128i(a, 8), b);
或
__m128i dst = _mm_castpd_si128(mm_shuffle_pd(_mm_castsi128_pd(a),_mm_castsi128_pd(b),1));
有比第一种方法更好的方法吗?第二条只是一条指令,但切换到浮点 SIMD 执行比第一条的额外指令成本更高。
【问题讨论】:
-
我还不知道更好的方法。来自 SSE 4.1 的
_mm_blend_epi16(a,b,7)将在 dest 的上半部分为您提供 a 的上半部分,在 dest 的下半部分为您提供 b 的下半部分,但您仍然需要交换。 -
您可以与另一个
_mm_shuffle_epi32(dst,0x4e)交换,这可能比移位和解包更快(特别是如果混合是 3 个寄存器指令?)但我真的更喜欢 ssse3 或更早的解决方案跨度> -
我不知道 ssse3 或更低版本的更好方法。您可以在software.intel.com/sites/landingpage/IntrinsicsGuide 寻找它们
-
是的,该页面已添加书签 ;)
-
@SteveCox,_mm_shuffle_epi32 在 SSE2 中可用。我一直在不支持> SSE2的机器上使用它,它工作正常。您绝对不想从整数指令跨越到双精度指令。根据英特尔文档,它可能会引入额外的延迟。
标签: intel sse simd intrinsics