C-跑步时的增益是不同可能的矢量化的函数



我在一个简单的示例中使用gcc-4.9进行研究(我的小代码计算double 2阵列的总和),并将结果存储到输出阵列中)。

从我在网络上看到的东西,似乎存在:

  1. SSE矢量化(128位= 16个字节= 2*sizeof(double)
  2. avx矢量化(256位= 32个字节= 4*sizeof(double)
  3. avx2矢量化(512位= 64个字节= 8*sizeof(double)

我的问题是,在上面的三种情况下,我总是从大约等于2(相当平均增益为1.7)的情况下获得收益(无矢量和矢量化版本)。

我认为我不使用良好的汇编选项。我在这里做了什么:

  1. SSE:gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=native -ftree-vectorize -fopt-info-vec main.c

  2. for avx: gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=corei7-avx -ftree-vectorize -fopt-info-vec main.c

  3. for avx2: gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=core-avx2 -ftree-vectorize -fopt-info-vec main.c

当我运行3个案例时,我总是会得到2的一个因素,而我希望AVX的CC_11和factor 8的CC_12。

我的MacBook Pro上的处理器是:Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz

任何人都可以告诉我Active Avx和Avx2矢量化的不同标志?

也许我的Corei7不支持这些矢量化(只是SSE?)。

感谢您的帮助。

假设您已经实现了必要的展开和正确的包装呼叫,那么这里的问题可能与内存有关:

1)您将由于需要更慷慨的包装而需要更大的内存块将缓存敲打。

2)您可能需要通过告诉您希望将数据对准32 Byn(这将有助于优化)来帮助编译器。查找" #pragma vector Aligned"它可能会或可能无济于事。

3)如果您的数组大小不是包装的倍数,也可能会有开销 - 因此,对于Avx2,这将是8个倍数。一个相对较小的开销)。

4)尝试将优化程度降低为-O2。有时,您告诉编译器越多地负责您的代码效率较低。

但是,您可能会再次使用较大的包装操作来遇到"高速效应"问题(您可能会从L1移至L2)。

最新更新