存储__m256向量的总和而没有AVX到SSE的转换惩罚?

时间:2013-09-10 11:29:21

标签: simd avx

以下代码是否会导致AVX-to-SSE转换惩罚?如果是这样,我如何存储__m256向量的总和而不会产生这种惩罚?

__mm256 x_swap = _mm_permute2f128_ps(x,x,1)
x = _mm256_add_ps(x, x_swap);
x = _mm256_hadd_ps(x,x);
x = _mm256_hadd_ps(x,x);  // now all fields of x contain the sum

float sum;
_mm_store_ss(&sum, _mm256_castps256_ps128(x));

谢谢。

1 个答案:

答案 0 :(得分:5)

只要您使用-mavx编译代码,就不应该看到任何AVX-SSE转换惩罚。使用-mavx进行编译时,您会自动使用较新的非破坏性SSE操作码,并且在将这些操作与AVX指令混合时不会受到惩罚。只有在将旧版SSE指令与AVX混合时才会产生这种惩罚,通常这只发生在汇编代码或混合使用不同标志编译的模块时。