如何在gcc中保留命令行选项,但为某些功能添加更多优化标志

how to keep command line options but add more optimization flag to certain function in gcc

本文关键字:功能 添加 标志 优化 gcc 保留 选项 命令行      更新时间:2023-10-16

一个简单的例子:

auto f(double*a,unsigned long const N)
{
   for(auto i(0);i!=N;++i) a[i]+=2*i;
}

,然后使用g++ -std=c++1z -O2 -march=native -ftree-vectorize -fopt-info -S编译源代码。输出显示:音符循环矢量化。很好。

之后,我想对这样的函数添加更积极的优化。所以我写:

__attribute__((optimize("unroll-loops"))) auto f(double*a,unsigned long const N)
{
  for(auto i(0);i!=N;++i) a[i]+=2*i;
}

,然后使用g++ -std=c++1z -O2 -march=native -ftree-vectorize -fopt-info -S编译源代码。输出显示:音符循环展开7次。然后我检查asm文件,发现gcc只是做了unroll-loops优化,但忽略了命令行中的树矢量化。

我也试着使用:

#pragma GCC optimize("unroll-loops")
auto f(double*a,unsigned long const N)
{
  for(auto i(0);i!=N;++i) a[i]+=2*i;
}

仍然不能工作。所以我想问一下如何保留命令行选项,但为某些功能添加更多优化标志。

我用的是g++-5.2, x86-64 linux, cpu支持avx2

来自GCC文档…

优化

optimize属性用于指定要使用不同于命令行中指定的优化选项编译函数。参数可以是数字或字符串。数字被认为是一个优化级别。以0开头的字符串被认为是一个优化选项,而其他选项则被认为与-f前缀一起使用。您还可以使用' #pragma GCC optimize ' pragma来设置影响多个函数的优化选项。有关' #pragma GCC optimize ' pragma的详细信息,请参见Function Specific Option pragma。

因此,optimize属性与#pragma是不可加的。您必须显式地将所有必要的优化参数传递给该属性。

例如…

__attribute__((optimize("O2", "tree-vectorize", "unroll-loops"))) auto f(double*a,unsigned long const N)
{
  for(auto i(0);i!=N;++i) a[i]+=2*i;
}

但是,使用PGO可以获得更好的结果,而不是显式地强制编译器使用特定的优化。