作为不同可能的矢量化的函数获得运行时

时间:2016-11-28 16:17:34

标签: c gcc vectorization compiler-optimization

我正在使用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)
  4. 我的问题是,在上述三种情况下,我总是获得大约等于2的增益(在非矢量化和矢量化版本之间)(平均增益为1.7)。

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

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

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

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

    4. 当我运行这3个案例时,我总是得到2左右的因素,而我预计factor 4的{​​{1}}和AVX的{​​{1}} }。

      MacBook Pro上的处理器是:factor 8

      有人能告诉我有效AVX和AVX2矢量化的不同标志吗?

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

      感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

假设您已经实施了必要的展开和正确的打包调用,那么这里的问题可能与内存有关:

1)由于你需要利用更大量的包装来获得更大的内存块,你将更加努力地对缓存进行锤击。

2)您可能需要通过告知您希望数据与32byte对齐来帮助编译器(这将有助于优化)。查找" #pragma vector aligned"它可能会或可能没有帮助。

3)如果您的数组大小不是打包的倍数,则可能还会产生开销 - 因此对于AVX2,这将是8的倍数。一些时间可能花费在"余数"循环(但这应该是一个相对较小的开销)。

4)尝试将优化程度降低到-O2。有时,你告诉编译器要负责你的代码效率会降低。

但是,你可能会再次达到"缓存效率"更大的包装操作问题(你可能会从L1转向L2)。