4

以下代码是否会产生 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));

谢谢你。

4

1 回答 1

5

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

于 2013-09-10T13:19:01.610 回答