告诉gcc具体展开一个循环

告诉gcc具体展开一个循环,c,gcc,pragma,unroll,C,Gcc,Pragma,Unroll,我如何告诉GCC展开一个特定的循环? 我使用过CUDA SDK,可以使用#pragma unroll手动展开循环。gcc有类似的特性吗?我在谷歌上搜索了一下,但什么也没找到。-funroll循环可能会有帮助(尽管它会全局打开循环展开,而不是每个循环)。我不确定是否有一个#pragma来做同样的事情…-funroll循环可能会有帮助(尽管它会全局打开循环展开,而不是每个循环)。我不确定是否有一个#pragma来做同样的事情…GCC为您提供了几种不同的处理方法: 使用#pragma指令,如#pra

我如何告诉GCC展开一个特定的循环?
我使用过CUDA SDK,可以使用
#pragma unroll
手动展开循环。gcc有类似的特性吗?我在谷歌上搜索了一下,但什么也没找到。

-funroll循环
可能会有帮助(尽管它会全局打开循环展开,而不是每个循环)。我不确定是否有一个
#pragma
来做同样的事情…

-funroll循环
可能会有帮助(尽管它会全局打开循环展开,而不是每个循环)。我不确定是否有一个
#pragma
来做同样的事情…

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

  • 使用#pragma指令,如
    #pragma GCC优化(“字符串”…)
    ,如中所示。请注意,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的属性语法注释单个函数:查看文档以获得关于该主题的更详细的论文。例如:

    //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更好地处理我的代码)。不过,这些示例应该可以很好地编译。

GCC提供了几种不同的处理方法:

  • 使用#pragma指令,如
    #pragma GCC优化(“字符串”…)
    ,如中所示。请注意,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的属性语法注释单个函数:查看文档以获得关于该主题的更详细的论文。例如:

    //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更好地处理我的代码)。不过,这些示例应该编译得很好。

GCC 8获得了一个新的pragma,允许您控制循环展开的方式:

#pragma GCC展开n

从手册中引用:

您可以使用此pragma来控制循环应执行的次数 展开。它必须放在for、while或do循环的前面 或一个#pragma GCC ivdep,并且仅适用于下面的循环。N 是指定展开因子的整型常量表达式。这个 值0和1会阻止循环的任何展开


GCC 8获得了一个新的pragma,允许您控制循环展开的方式:

#pragma GCC展开n

从手册中引用:

您可以使用此pragma来控制循环应执行的次数 展开。它必须放在for、while或do循环的前面 或一个#pragma GCC ivdep,并且仅适用于下面的循环。N 是指定展开因子的整型常量表达式。这个 值0和1会阻止循环的任何展开



不,我也发现了,但我只想从broadcom中展开一个特定的loopbmei。我有一组补丁要添加对gcc的“#pragma unroll”支持。@Jerry Coffin,我如何使用它?你能给我一个使用-funroll循环的命令吗?不,我也发现了,但我只想打开一个特定的循环。broadcom的我有一套补丁程序要添加对gcc的“#pragma unroll”支持。@Jerry Coffin,我怎么使用它?你能给我一个使用-funroll循环的命令吗?嘿,你能用宏吗?可能不会,所以写出来是唯一剩下的事情了?非常严肃地说,我建议在使用达夫的设备之前,用
-funroll循环
单独编译这一位:这是一个很好的研究,但在代码中有一个丑陋的东西。你可以用宏来包装。我已经为现场优化做过一两次了。对@dmckee的评论投了赞成票,但我要补充的是“-funroll loops”对我来说总是听起来像是主题公园里一辆很酷的过山车的名字:-)Gcc现在有一个pragma:嘿,你能用宏来做吗?可能不会,所以写出来是唯一剩下的事情了?非常严肃地说,我建议在使用达夫的设备之前,用
-funroll循环
单独编译这一位:这是一个很好的研究,但在代码中有一个丑陋的东西。你可以用宏来包装。我曾经做过一两次现场优化。对@dmckee的评论投了赞成票,但我只需要补充一点——“funroll loops”在我看来总是像主题公园里的过山车的名字:-)Gcc现在有一个pragma:非常酷,它有一个函数属性,但是苹果最新的用于iOS的Gcc忽略了它:“警告:'optimize'属性指令被忽略”。(我知道他们已经转换到LLVM,但我有时仍然使用GCC,因为它有时会生成更快的代码。)有人知道为什么它被忽略了吗?苹果的GCC分支太旧了吗?顺便说一句,在我使用它的函数中,只要我使用-O3,循环就会展开。我刚刚尝试了
\uu属性(优化(“展开循环”))
使用一些嵌入式代码,速度仅提高了3%。手动展开8倍,速度提高了12%,程序大小没有增加那么多。我的gcc告诉警告:忽略#pragma optimize…这总是可用的吗?如果其他人想知道,clang 3.9和icc 13都不支持此属性,也不支持pragmaVery cool这其中有一个函数属性,但是苹果最新的iOS GCC忽略了它:“警告:'优化'属性指令被忽略”。(我知道他们已经转换到LLVM,但我有时仍在使用GCC,因为它有时会生成更快的代码。)有人知道为什么它被忽略了吗?苹果的GCC分支太旧了吗