繁体   English   中英

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

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

一个简单的例子:

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来编译源代码。 输出只显示:note循环展开7次。 然后我检查asm文件并发现gcc只是执行unroll-loops优化但忽略了命令行中的tree-vectorize。

我也尝试使用:

#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属性用于指定使用与命令行上指定的不同优化选项编译函数。 参数可以是数字或字符串。 假设数字是优化级别。 假设以O开头的字符串是优化选项,而假定其他选项与-f前缀一起使用。 您还可以使用'#pragma GCC optimize'编译指示来设置影响多个函数的优化选项。 有关'#pragma GCC optimize'编译指示的详细信息,请参阅功能特定选项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可能会获得更好的结果,而不是显式强制编译器使用特定的优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM