在clang中的循环展开

7

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

#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标志,则不会展开任何循环。
此外,有没有关于如何调试pragma错误的提示?
2个回答

7
我认为在clang 3.5中不支持这样的pragma。
然而,从3.6开始,您可以使用#pragma clang loop unroll(enable | disable)来启用或禁用基于自动诊断的展开特性。如果您想完全展开一个循环,那么#pragma clang loop unroll(full)是其简写。您还可以使用#pragma clang loop unroll_count(N) - 其中N是编译时常量 - 显式指定展开计数。
更多信息请参见此处您的代码可按照上述内容进行重写:
#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;
}

1
"-unroll-count=4"的优先级高于"#pragma clang loop unroll_count(2)"。这就是为什么它最终被展开了4次。这意味着编译器遵循的是unroll-count命令行选项,而不是#pragma。另外,正如plasmacel所提到的,在clang 3.6之前不支持#pragma clang loop unroll。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接