C++ 展开循环超过循环限制

C++ 展开循环超过循环限制,c++,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; } #include<iostream&g

我以前从未尝试过展开循环。请直说我愚蠢的怀疑

我试着跟随,它的工作,因为它应该

#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;
}
#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;
}
#包括
#包括
使用名称空间std;
int main(){
#布拉格展开4
对于(inti=0;i我建议你

在CUDA中,unroll指令仅适用于设备代码循环。问题中关于线程发生了什么的陈述是不正确的。事实上,C/C++代码中放置的未识别的
pragma
应该对代码没有任何影响,您的结果证明了这一点

如果我尝试展开循环超过循环限制,会怎么样

从文件中:

编译器还将插入代码以确保正确性……由程序员来确保指定的展开编号提供最佳性能

使用
#pragma unroll
不应该单独生成“坏”代码。如果你做了一些疯狂的事情(比如将循环展开100次,在实践中执行的次数永远不会超过几次),那么你得到的性能结果可能会比让编译器来处理要低

在大多数情况下,我建议不要使用此指令,除非您了解的一般优化原则,也熟悉在组装时检查回路(SASS)级别。或者,如果您有固定的行程长度循环,一些尝试和错误以及基准测试可能会在不进行仔细分析的情况下产生有用的结果。偶然使用此指令不太可能产生比编译器生成的代码运行得更快的代码。从文档中可以看出:

默认情况下,编译器展开具有已知跳闸计数的小循环


循环展开与多线程无关。你是否有可能混淆了这两者?pragma会不会将此部分变成4个Posix线程,每个线程进行一次迭代?我想了解在这种情况下,pragma在幕后做了什么。这是CUDA吗?我发现
#pragma unroll
唯一有效的地方是CUDA。在这种情况下,我对它的了解很少,所以你可以忽略我的评论。如果你是CUDA,你应该把它标记为这样。C++的人可能不会为你提供答案,因为这不是C++。它也不是CUDA。这完全是主机(CPU)代码。还有识别代码<
4次是因为你有一个循环,它迭代了4次。没有生成线程或类似的东西。它与unroll指令无关,这可能会被你可能使用的任何主机编译器完全忽略。非常感谢!我只是感到困惑,因为我看到了带有#pragma的输出,所以我想我知道了我认为你说的有道理:我的编译器忽略了它,并像执行普通代码一样执行它。