以下代码是否会导致 AVX 到 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));
谢谢。
只要你用-mavx
编译你的代码,那么你不应该看到任何AVX-SSE转换惩罚。使用 -mavx
进行编译时,您会自动使用较新的非破坏性 SSE 操作码,并且将这些操作码与 AVX 指令混合时不会受到任何惩罚。仅当您将旧版 SSE 指令与 AVX 混合时才会产生惩罚,并且通常这只会发生在汇编代码或混合使用不同标志编译的模块时。