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;
}