文章

gcc 向量化相关选项

1. alias选项

strict aliasing是编译器优化中依赖的一个假设,即不同类型的指针,指向不同的内存区域。基于该假设,gcc编译器可以进行一些优化。gcc优化-O2默认开启该选项(-fstrict-aliasing)。

使用该选项,需要保证不同类型指针的内存区域不重叠,否则会导致未定义行为。例如:

1
2
3
int a = 10;
int* p1 = &a;
float* p2 = (float*)&a;

如果不能保证,则使用-fno-strict-aliasing选项。该选项导致性能下降,例如每次可能会从内存中读取数据,而不是寄存器。

要保证代码类型转换安全,使用编译选项:

1
add_compile_options(-Wstrict-aliasing) # -Werror -Wall

参考: Casting does not work as expected when optimization is turned on

2. vectorize选项

  • -ftree-vectorize: 整个代码中,可能的向量化优化。
  • -ftree-loop-vectorize: 循环中的向量化优化。
  • -fopt-info-vec-missed: 显示没有向量化的循环。
  • -fopt-info-vec-optimized: 显示已向量化的循环。

另外,在本地,想要充分优化,设置:

1
2
set(CMAKE_C_FLAGS_RELEASE "-O3 -march=native")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native")

编写代码过程中,影响向量化的因素有:

  • exception: 异常处理会影响向量化。尽可能使用noexceptconst

3. 调试–看IR

1
add_compile_options(-fdump-tree-dse) #查看 dead store elimination 之后的 IR

4. vectorize 更多资料

入门资料:

更多资料:

本文由作者按照 CC BY 4.0 进行授权