【问题标题】:Loop unrolling in clang在铿锵声中展开循环
【发布时间】:2014-12-05 06:38:49
【问题描述】:

我正在尝试在以下程序中选择性地展开第二个循环:

#include <stdio.h>

int main()
{
    int in[1000], out[1000]; 
    int i,j;

    #pragma nounroll
    for (i = 100; i < 1000; i++)
    {
       in[i]+= 10;
    }

    #pragma unroll 2
    for (j = 100; j < 1000; j++)
    {
       out[j]+= 10;
    }

    return 1;
}

当我使用以下选项运行 clang (3.5) 时,它会将两个循环展开 4 次。

clang -std=c++11 -O3 -fno-slp-vectorize -fno-vectorize -mllvm -unroll-count=4 -mllvm -debug-pass=Arguments -emit-llvm -c *.cpp 

我做错了什么?另外,如果我添加-fno-unroll-loops,或跳过-unroll-count=4 标志,它不会展开任何循环。

另外,关于如何调试编译错误的任何提示?

【问题讨论】:

    标签: c++ optimization clang llvm-clang loop-unrolling


    【解决方案1】:

    我认为 clang 3.5 中不支持此类 pragma。

    但是从 3.6 开始,您可以使用 #pragma clang loop unroll(enable | disable) 来启用或禁用基于诊断的自动展开功能。如果你想完全展开一个循环,那么#pragma clang loop unroll(full) 是它的简写。您还可以使用 #pragma clang loop unroll_count(N) - 其中 N 是编译时常量 - 显式指定展开计数。

    更多信息here

    根据上述内容重写您的代码:

    #include <stdio.h>
    
    int main()
    {
    
      int in[1000], out[1000]; 
      int i,j;
    
      #pragma clang loop unroll(disable)
      for (i = 100; i < 1000; i++)
      {
         in[i]+= 10;
      }
    
      #pragma clang loop unroll_count(2)
      for (j = 100; j < 1000; j++)
      {
         out[j]+= 10;
      }
    
    
      return 1;
    }
    

    【讨论】:

      【解决方案2】:

      -unroll-count=4 的优先级高于#pragma clang loop unroll_count(2)。这就是为什么它最终将其展开 4。这意味着编译器遵循 unroll-count 命令行选项而不是编译指示。同样如plasmcel 所述,在clang 3.6 之前不支持#pragma clang loop unroll。

      【讨论】:

        猜你喜欢
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2012-07-08
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        相关资源
        最近更新 更多