代码之家  ›  专栏  ›  技术社区  ›  Nils

告诉gcc具体展开循环

  •  42
  • Nils  · 技术社区  · 14 年前

    如何告诉GCC展开特定的循环? #pragma unroll . gcc有类似的特性吗?我搜索了一下,但什么也找不到。

    3 回复  |  直到 12 年前
        1
  •  55
  •   Philip Conrad Piotr Perak    12 年前

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

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

        2
  •  7
  •   Frederik Deweerdt    6 年前

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

    #pragma GCC unroll n

    引用手册:

    您可以使用此pragma来控制一个循环的次数 展开。它必须放在for、while或do循环之前 是一个整数常量表达式,指定展开因子。这个

        3
  •  4
  •   Jerry Coffin    14 年前

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

    推荐文章