如何告诉GCC展开特定循环?
我使用了CUDA SDK,可以使用#pragma unroll
手动展开循环。 gcc有类似的功能吗?我google了一下但找不到任何东西。
答案 0 :(得分:52)
GCC为您提供了几种不同的处理方式:
使用 #pragma指令,如#pragma GCC optimize ("string"...)
,如GCC docs中所示。请注意,pragma为其余函数进行优化全局。如果您巧妙地使用了#pragma push_options
和pop_options
宏,那么您可以围绕一个函数来定义它,如下所示:
#pragma GCC push_options
#pragma GCC optimize ("unroll-loops")
//add 5 to each element of the int array.
void add5(int a[20]) {
int i = 19;
for(; i > 0; i--) {
a[i] += 5;
}
}
#pragma GCC pop_options
使用 GCC的属性语法注释单个函数:查看GCC function attribute文档以获取有关该主题的更详细论文。一个例子:
//add 5 to each element of the int array.
__attribute__((optimize("unroll-loops")))
void add5(int a[20]) {
int i = 19;
for(; i > 0; i--) {
a[i] += 5;
}
}
注意:我不确定GCC在展开反向迭代循环方面有多好(我这样做是为了让Markdown与我的代码一起玩得很好)。但是这些例子应该编译得很好。
答案 1 :(得分:4)
-funroll-loops
可能会有所帮助(尽管它会全局循环展开,而不是按循环展开)。我不确定是否有#pragma
做同样的事情......
答案 2 :(得分:3)
GCC 8获得了新的编译指示,可让您控制循环展开的方式:
#pragma GCC unroll n
引用手册:
您可以使用此编译指示来控制循环应该执行多少次 展开。必须将其放置在for,while或do循环之前 或#pragma GCC ivdep,并且仅适用于随后的循环。 ñ 是一个整数常数表达式,指定展开因子。的 值为0和1会阻止循环的展开。