我正在尝试在以下程序中有选择地展开第二个循环:
#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错误的任何提示吗?
答案 0 :(得分:3)
我认为在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;
}
答案 1 :(得分:1)
-unroll-count=4
的优先级高于#pragma clang loop unroll_count(2)
。这就是为什么它最终以4展开。这意味着编译器遵循的是unroll-count命令行选项,而不是编译指示。同样如plasmacel所述,在clang 3.6之前,不支持#pragma clang循环展开。