Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于AVX中SSE Unpaclo_ps/Unpachi_ps(双打)_C_Sse_Avx - Fatal编程技术网

相当于AVX中SSE Unpaclo_ps/Unpachi_ps(双打)

相当于AVX中SSE Unpaclo_ps/Unpachi_ps(双打),c,sse,avx,C,Sse,Avx,在SSE中,如果我有一个包含4个浮点数的128位寄存器,即 A = a b c d ('a','b','c','d' are floats and 'A' is a 128-bit SSE register) 及 如果我愿意 C = a e b f 我可以简单地做到: C = _mm_unpacklo_ps(A,B); 如果我想的话,也一样 D = c g d h 我可以做到: D = _mm_unpackhi_ps(A,B); 如果我有一个包含双精度的AVX寄存器,是否可以对一条指令

在SSE中,如果我有一个包含4个浮点数的128位寄存器,即

A = a b c d ('a','b','c','d' are floats and 'A' is a 128-bit SSE register)

如果我愿意

C = a e b f
我可以简单地做到:

C = _mm_unpacklo_ps(A,B);
如果我想的话,也一样

D = c g d h
我可以做到:

D = _mm_unpackhi_ps(A,B);
如果我有一个包含双精度的AVX寄存器,是否可以对一条指令执行相同的操作


基于这些内在函数的工作原理,我知道我不能使用
\u mm256\u unplo\u pd()
\u mm256\u shuffle\u pd()
\u mm256\u permute2f128\u pd()
\u mm256\u blend\u pd()
。除了这些指令之外,还有什么指令我可以使用,或者我必须使用上述指令的组合吗?

我可以想到的一种方法是:

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);

如果有人有更好的解决方案,请发下面的帖子。

我认为你不会做得更好。因为在这个过程中需要值跨越128位边界,所以我认为必须使用128位置换函数之一。这只是AVX的局限性之一。即将推出的Haswell x86处理器系列中支持的AVX2更灵活一些,因为它将支持从任意位置到任意位置的排列操作,但我仍然不确定它是否会产生更短的指令序列。
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);