不。这意味着您使用一个块调用了 CUDA 内核,并且该块有 100 个活动线程。您将 size 作为第二个函数参数传递给内核。在您的内核中,这 100 个线程中的每一个都执行 for 循环 100 次。
#pragma unroll
是一种编译器优化,例如可以替换如下代码
for ( int i = 0; i < 5; i++ )
b[i] = i;
with
b[0] = 0;
b[1] = 1;
b[2] = 2;
b[3] = 3;
b[4] = 4;
通过把#pragma unroll
指令就在循环之前。展开版本的好处是处理器的处理负载较少。的情况下for
循环版本,处理,除了分配每个i
to b[i]
, 涉及i
初始化、评估i<5
6次,并递增i
5次。而在第二种情况下,它只涉及归档b
数组内容(也许加上int i=5;
if i
后面会用到)。循环展开的另一个好处是增强指令级并行性 (ILP)。在展开版本中,处理器可能会将更多操作推入处理管道,而不必担心for
每次迭代中的循环条件。
类似的帖子this https://stackoverflow.com/q/5495634/2386951解释 CUDA 无法展开运行时循环。在你的情况下,CUDA编译器没有任何线索size
将为 100,因此不会发生编译时循环展开,因此如果强制展开,最终可能会损害性能。
如果您确定size
对于所有执行都是 100,您可以像下面这样展开循环:
#pragma unroll
for(int i=0;i<SIZE;i++) //or simply for(int i=0;i<100;i++)
b[i]=i;
其中SIZE
在编译时已知#define SIZE 100
.
我还建议您在代码中进行适当的 CUDA 错误检查(已解释)here https://stackoverflow.com/q/14038589/2386951).