自动矢量化GCC

时间:2012-10-25 10:04:26

标签: c++ gcc vectorization

我正在尝试让GCC 4.7自动向量化我的代码的某些部分以提高速度,但是,似乎很难这样做。

这里有一些我想要矢量化的代码:

void VideoLine::WriteOut(unsigned short * __restrict__  start_of_line, const int  number_of_sub_pixels_to_write)
{
  unsigned short * __restrict__ write_pointer = (unsigned short *)__builtin_assume_aligned (start_of_line, 16);
  unsigned short * __restrict__ line = (unsigned short *)__builtin_assume_aligned (_line, 16);
  for (int i = 0; i < number_of_sub_pixels_to_write; i++)
  {
    write_pointer[i] = line[i];
  }
}

我正在使用以下GCC开关:

-std=c++0x \
-o3 \
-msse \
-msse2 \
-msse3 \
-msse4.1 \
-msse4.2 \
-ftree-vectorizer-verbose=5\
-funsafe-loop-optimizations\
-march=corei7-avx \
-mavx \
-fdump-tree-vect-details \
-fdump-tree-optimized \

我知道有些人会覆盖其他人。

我根本没有从矢量化器获得任何输出,但是,当查看.optomized文件时,我可以看到它没有使用矢量化。任何人都可以用正确的方式指出我进行矢量化吗?

编辑:原来问题是使用-o3而不是-O3。

2 个答案:

答案 0 :(得分:0)

尝试保证,number_of_sub_pixels_to_write是4的倍数,通过屏蔽它就像在这里完成它一样: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s04s03.html

答案 1 :(得分:0)

编译器可以自由地做它喜欢的事情。因此,如果您真的想使用SIMD功能(而不是依赖编译器),则应使用这些功能(参见manual)。