在SSE中,如果我有一个包含4个浮点数的128位寄存器,即
A = a b c d ('a','b','c','d' are floats and 'A' is a 128-bit SSE register)
和
B = e f g h
然后如果我想要
C = a e b f
我可以这样做:
C = _mm_unpacklo_ps(A,B);
同样如果我想要
D = c g d h
我能做到:
D = _mm_unpackhi_ps(A,B);
如果我有一个包含双精度的AVX寄存器,是否可以用一条指令执行相同操作?
根据这些内在函数的工作原理,我知道我无法使用_mm256_unpacklo_pd()
,_mm256_shuffle_pd()
,_mm256_permute2f128_pd()
或_mm256_blend_pd()
。除了这些我还可以使用或者我必须使用上述说明的组合吗?
答案 0 :(得分:4)
我能想到的一种方法如下:
A1 = _mm256_unpacklo_pd(A,B);
A2 = _mm256_unpackhi_pd(A,B);
C = _mm256_permute2f128_pd(A1,A2,0x20);
D = _mm256_permute2f128_pd(A1,A2,0x31);
如果有人有更好的解决方案,请在下面发帖。