我正在用gcc-4.9测试一个研究矢量化的简单示例(我的小代码计算double 2数组的和,并将结果存储到输出数组中)。
从我在网上看到的情况来看,似乎存在着:
2*sizeof(double) )4*sizeof(double) )8*sizeof(double)我的问题是,在上述三种情况下,我总是得到一个增益(在非向量化版本和向量化版本之间),大致等于2(相当平均的增益为1.7)。
我认为我没有使用好的编译选项。在这里我所做的:
gcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=native -ftree-vectorize -fopt-info-vec main.cgcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=corei7-avx -ftree-vectorize -fopt-info-vec main.cgcc-mp-4.9 -std=c99 -Wa,-q -O3 -march=core-avx2 -ftree-vectorize -fopt-info-vec main.c当我运行这3种情况时,我总是在2周围找到一个因素,而我希望达到factor 4 for AVX和factor 8 for AVX2。
我的MacBook pro上的处理器是:Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz
谁能告诉我不同的标志,主动AVX和AVX2矢量化?
也许,我的corei7不支持这些向量化(只支持SSE ?)。
谢谢你的帮助。
发布于 2016-11-28 17:11:32
假设您已经实现了必要的展开和正确的打包调用,那么这里的问题可能与内存有关:
1)由于需要更大的内存块来利用更慷慨的打包,您将更难将缓存敲碎。
2)您可能需要在这里帮助编译器,告诉您希望您的数据对齐为32字节(这将有助于优化)。查找“#语用矢量对齐”,它可能有帮助,也可能没有帮助。
3)如果数组大小不是封装的倍数,也可能存在开销--因此对于AVX2来说,这将是8的倍数。在“剩余”循环中可能会花费一些时间(但这应该是相对较小的开销)。
4)尝试降低-O2的优化程度。有时,越多地告诉编译器来管理代码,代码的效率就会越低。
但是,您可能会遇到更大的打包操作中的“缓存效率”问题(您可能会从L1迁移到L2)。
https://stackoverflow.com/questions/40848911
复制相似问题