我正在使用gcc-4.9
进行测试,用于研究矢量化(我的小代码计算double
2个数组的总和并将结果存储到输出数组中。)
从我在网上看到的情况来看,似乎存在:
2*sizeof(double)
4*sizeof(double)
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
的{{1}}和AVX
的{{1}} }。
MacBook Pro上的处理器是:factor 8
有人能告诉我有效AVX和AVX2矢量化的不同标志吗?
也许,我的corei7不支持这些矢量化(只是SSE?)。
感谢您的帮助。
答案 0 :(得分:0)
假设您已经实施了必要的展开和正确的打包调用,那么这里的问题可能与内存有关:
1)由于你需要利用更大量的包装来获得更大的内存块,你将更加努力地对缓存进行锤击。
2)您可能需要通过告知您希望数据与32byte对齐来帮助编译器(这将有助于优化)。查找" #pragma vector aligned"它可能会或可能没有帮助。
3)如果您的数组大小不是打包的倍数,则可能还会产生开销 - 因此对于AVX2,这将是8的倍数。一些时间可能花费在"余数"循环(但这应该是一个相对较小的开销)。
4)尝试将优化程度降低到-O2。有时,你告诉编译器要负责你的代码效率会降低。
但是,你可能会再次达到"缓存效率"更大的包装操作问题(你可能会从L1转向L2)。