如何在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编译源代码。输出显示:音符循环展开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可以获得更好的结果,而不是显式地强制编译器使用特定的优化。
相关文章:
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 在大括号内添加语句会更改代码功能?
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- 如何在控制台应用程序中添加滚动功能以显示更大的输入
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- C++要在其中添加接口功能的类层次结构
- 在 C++ 中向多态树添加功能
- 如何将搜索功能添加到数组中
- 如何为内置类型添加成员功能,例如C 中的整数
- 疯狂(乘,添加,划分)哈希功能如何起作用
- 将功能参数添加到向量
- 使用指针在功能中的数组中添加/删除元素
- 将功能添加到默认复制构造函数中
- C 将类成员功能添加到地图中
- 如何将搜索功能添加到WXWIDGET C 中的TextCtrl
- 我应该如何将另一个类的方法的功能添加到我的当前类中?
- 为气泡排序功能添加计数器
- 无法为包装器功能添加完美的转发
- 当您下载其他库并将其功能添加到C ++程序中时,您是否能够在另一台PC上运行您的软件(没有库)?
- 如何在gcc中保留命令行选项,但为某些功能添加更多优化标志