告诉gcc专门展开一个循环

时间:2010-11-01 18:01:32

标签: c gcc pragma unroll

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

3 个答案:

答案 0 :(得分:52)

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

  • 使用 #pragma指令,如#pragma GCC optimize ("string"...),如GCC docs中所示。请注意,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 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会阻止循环的展开。