62

如何告诉 GCC 展开特定循环?我使用了 CUDA SDK,其中可以使用#pragma unroll. gcc 有类似的功能吗?我用谷歌搜索了一下,但找不到任何东西。

4

3 回答 3

63

GCC 为您提供了几种不同的处理方式:

  • 使用#pragma 指令,如GCC 文档#pragma GCC optimize ("string"...)中所见。请注意,pragma 使其余函数的优化成为全局的。如果您巧妙地使用和宏,您可能可以只围绕一个函数定义它,如下所示:#pragma push_optionspop_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 回答