我在一个简单的示例中使用gcc-4.9
进行研究(我的小代码计算double
2阵列的总和),并将结果存储到输出阵列中)。
从我在网络上看到的东西,似乎存在:
- SSE矢量化(128位= 16个字节=
2*sizeof(double)
- avx矢量化(256位= 32个字节=
4*sizeof(double)
- avx2矢量化(512位= 64个字节=
8*sizeof(double)
我的问题是,在上面的三种情况下,我总是从大约等于2(相当平均增益为1.7)的情况下获得收益(无矢量和矢量化版本)。
。我认为我不使用良好的汇编选项。我在这里做了什么:
SSE:
gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=native -ftree-vectorize -fopt-info-vec main.c
for avx:
gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=corei7-avx -ftree-vectorize -fopt-info-vec main.c
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)。