我在一个研究矢量化的简单例子上使用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
对于AVX:gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=corei7-avx -ftree-vectorize -fopt-info-vec main.c
对于AVX2:gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=core-avx2 -ftree-vectorize -fopt-info-vec main.c
当我运行这3个案例时,我总是得到一个系数2
,而我希望达到factor 4
的aAVX
和factor 8
的aAVX2
。
我的MacBook pro上的处理器是:Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz
有人能告诉我激活AVX和AVX2矢量化的不同标志吗?
也许,我的corei7不支持这些矢量化(只是SSE?).
谢谢你的帮助。
最佳答案
假设您已经实现了必要的展开和正确的打包调用,那么这里的问题可能与内存有关:
1)由于需要利用更大的内存块来进行更大的打包,因此您将更加努力地敲打缓存。
2)您可能需要在这里告诉编译器您希望您的数据是32字节对齐的(这将有助于优化)。查找“pragma vector aligned”可能有帮助,也可能没有帮助。
3)如果数组大小不是打包的倍数,也可能会有开销,因此对于AVX2,这将是8的倍数。在“余数”循环中可能会花费一些时间(但这应该是一个相对较小的开销)。
4)尝试将优化程度降低到-O2。有时候你告诉编译器越多,代码的效率就越低。
但同样,对于较大的打包操作,您可能会遇到“缓存效率”问题(您可能会从L1移动到L2)。
关于c - 根据不同的可能矢量化获得运行时 yield ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40848911/