如何告诉 GCC 展开特定循环?我使用了 CUDA SDK,其中可以使用#pragma unroll
. gcc 有类似的功能吗?我用谷歌搜索了一下,但找不到任何东西。
问问题
44818 次
3 回答
63
GCC 为您提供了几种不同的处理方式:
使用#pragma 指令,如GCC 文档
#pragma GCC optimize ("string"...)
中所见。请注意,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 函数属性文档以获取有关该主题的更详细的论文。一个例子:
//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 与我的代码配合得很好)。不过,这些示例应该可以正常编译。
于 2013-01-10T05:44:49.863 回答
46
GCC 8 获得了一个新的编译指示,允许您控制循环展开的方式:
#pragma GCC unroll n
引用手册:
您可以使用此编译指示来控制应展开循环的次数。它必须紧接在 for、while 或 do 循环或 #pragma GCC ivdep 之前,并且仅适用于随后的循环。n 是一个整数常量表达式,指定展开因子。值 0 和 1 会阻止循环的任何展开。
于 2019-02-22T17:10:23.717 回答
4
-funroll-loops
可能会有所帮助(尽管它会全局打开循环展开,而不是每个循环)。我不确定是否有#pragma
做同样的事情......
于 2010-11-01T18:07:07.600 回答