用于浮点代码的g ++优化开关

时间:2017-12-27 22:24:05

标签: gcc optimization g++ compiler-optimization simd

我正在尝试让一些代码运行得更快。它是浮点密集型代码 - 作为输入:

  • 参数(constant,double,int)
  • 输入值数组(常量,双精度)

输出

  • 值数组(double)
  • jacobian矩阵

目前我正在使用

g++-7 (Ubuntu 7.2.0-1ubuntu1~16.04) 7.2.0

和以下命令行:

g++-7 -S -fPIC -O3 -DNDEBUG -funroll-loops -march=native -ffast-math \
-I $BOOST_DIR tmp.cpp -std=c++17 \
-D__forceinline='__attribute__((always_inline))' \
-frecord-gcc-switches -Wno-attributes

从我的记忆中,G ++编译器在过去产生了更好的代码 - 并且还在更长时间地咀嚼这样的代码。我试过玩各种选项,但只有

--param max-gcse-memory=1

似乎有任何影响 - 使用或不使用此参数。忽略参数值的变化。

我对更好代码的标准是代码中的vmov / mov指令与vmul [sp] d指令相比的数量。更好的代码应该包含更少的[v] mov指令。

使用时

--param max-gcse-memory=1

与没有此参数的11325相比,我得到10766 [v] mov指令。 相比之下,1000 vmulpd和1900 vmulsd - 两次尝试之间的数字或多或少保持不变。

再次 - 我不介意编译时间。我希望得到更好的代码,从过去(2010年)我记得的,我有更好的代码,包括更长的编译时间。

1 个答案:

答案 0 :(得分:1)

SIMD指令通常需要对齐数据。听起来GCC正在生成大量代码来防止数据不完全对齐。

如果你可以修改代码,听起来好像你可以使用aligned属性,或者更好的是,使用OpenMP SIMD编译指示。

根据程序的结构,LTO(-flto)可能会产生很大的不同,因为限制功能可见性(即-fvisibility = hidden)。

基本上,您希望为优化器提供尽可能多的工作空间,以便它可以删除大量额外的代码,以便为SIMD指令正确对齐。

您可能还需要考虑启用更多ISA扩展... AVX支持256位向量,这意味着您可以使用指令执行两倍的工作,并且您的CPU很有可能支持它。如果您要运送可执行文件以在其他计算机上运行,​​请考虑使用target_clones属性,以便轻松生成针对多个ISA扩展而优化的代码。