展开循环超过循环限制

时间:2014-06-26 22:57:22

标签: c++

之前从未尝试过循环展开。请袒露我的愚蠢怀疑。

我尝试了以下操作,它可以正常工作。

#include<iostream>
#include<conio.h>

using namespace std;
int main(){
  #pragma unroll 4
for(int i=0 ; i<4 ; i++)
    cout<<"Hi"<<endl;
  getch();
return 0;
}

这会产生4个线程来执行任务并打印Hi 4次。然后我尝试了下面的代码,它打印了3次,应该是它。

#include<iostream>
#include<conio.h>

using namespace std;
int main(){
  #pragma unroll 4
for(int i=0 ; i<3 ; i++)
    cout<<"Hi"<<endl;
  getch();
return 0;
}

现在我的问题是:

如果我尝试展开循环超过循环限制怎么办?在这种情况下,将有4个线程,其中3个将执行有用的工作,1个将等待其他人完成或编译器将自动更正它,只有3个线程将跨越?我希望我对自己的天真问题很清楚。请原谅我的无知。我在学习。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我建议你read the documentation

在CUDA中,unroll指令仅适用于设备代码循环。问题中关于线程发生的事情的陈述是不正确的。实际上,放在C / C ++代码中的无法识别的pragma应该对代码没有任何影响,你的结果就是这样。

  

如果我尝试展开循环超过循环限制怎么办?

来自文档:

  

编译器还会插入代码以确保正确性......程序员必须确保指定的展开号码能够提供最佳性能。

使用#pragma unroll不应该自己生成“损坏的”代码。如果你做了一些疯狂的事情(比如展开一个循环100次,在实践中永远不会执行几次)那么你可能会得到更少的性能结果,而不仅仅是将它留给编译器来处理。

在大多数情况下,我建议不要使用此指令,除非您了解loop unrolling的一般优化原则,并且也熟悉检查程序集(SASS)级别的循环。或者,如果您有固定行程长度的循环,一些试验和错误以及基准测试可能会导致有用的结果,而无需仔细分析。暂时使用该指令不太可能产生运行速度比编译器生成的代码快的代码。来自文档:

  

默认情况下,编译器会显示已知行程计数的小循环。