C++ 响圈
我试图在以下程序中有选择地展开第二个循环:C++ 响圈,c++,optimization,clang,llvm-clang,loop-unrolling,C++,Optimization,Clang,Llvm Clang,Loop Unrolling,我试图在以下程序中有选择地展开第二个循环: #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++)
#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;
}
我做错了什么?此外,如果我添加-fno展开循环
,或跳过-unroll count=4
标志,它不会展开任何循环
还有,关于如何调试pragma错误的提示吗?我认为Clang3.5中不支持这种pragma 但是,从3.6开始,您可以使用
#pragma-clang循环展开(启用|禁用)
启用或禁用基于自动诊断的展开功能。如果你想完全展开一个循环,那么#pragma-clangloop-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;
}
#包括
int main()
{
整数输入[1000],输出[1000];
int i,j;
#pragma-clang循环展开(禁用)
对于(i=100;i<1000;i++)
{
in[i]+=10;
}
#pragma-clang循环展开计数(2)
对于(j=100;j<1000;j++)
{
out[j]+=10;
}
返回1;
}
-unroll count=4
的优先级高于\pragma-clang-loop-unroll\u count(2)
。这就是它最终以4展开的原因。这意味着编译器遵循的是“展开计数”命令行选项,而不是pragma。同样正如plasmacel所提到的,Clang3.6之前不支持#pragma-clang循环展开
#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;
}