Cuda pragma unroll到底做什么?它会影响线程的数量吗?

Cuda pragma unroll到底做什么?它会影响线程的数量吗?,cuda,nvidia,pragma,loop-unrolling,Cuda,Nvidia,Pragma,Loop Unrolling,我是CUDA新手,不懂循环展开。我已经写了一段代码来理解这项技术 __global__ void kernel(float *b, int size) { int tid = blockDim.x * blockIdx.x + threadIdx.x; #pragma unroll for(int i=0;i<size;i++) b[i]=i; } 这是否意味着我有size*size=10000个线程在运行以执行程序?循环展开时是否创建了100个线程?否

我是CUDA新手,不懂循环展开。我已经写了一段代码来理解这项技术

__global__ void kernel(float *b, int size)
{
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
 #pragma unroll
    for(int i=0;i<size;i++)
        b[i]=i;
}

这是否意味着我有
size
*
size
=10000个线程在运行以执行程序?循环展开时是否创建了100个线程?

否。这意味着您调用了一个具有一个块的CUDA内核,而该块具有100个活动线程。您正在将size作为第二个函数参数传递给内核。在内核中,这100个线程中的每一个都执行for循环100次

#pragma unroll
是一种编译器优化,例如,它可以替换类似

for ( int i = 0; i < 5; i++ )
    b[i] = i;

#pragma unroll
指令放在循环的正前方。展开版本的好处在于它减少了处理器的处理负载。对于
循环版本的
,除了将每个
i
分配给
b[i]
,处理还包括
i
初始化、评估
iNo。这意味着您调用了一个具有一个块的CUDA内核,该块具有100个活动线程。您正在将
size
作为第二个函数参数传递给内核。在内核中,这100个线程中的每一个都执行
循环100次。我建议你从基础开始学习CUDA,并逐步学习,而不是跳转到更高级或不太重要的材料,如循环展开。@Farsad,谢谢你,你能解释一下#pragma unroll做什么吗?我认为我可以在不使用pragma的情况下执行for循环?
#pragma unroll
也包含在中。这主要是因为它会降低并行计算性能。因为当是分支条件时,线程的扭曲不是平行的,这会使块中的任何线程偏离不同的指令路径,从而使SIMT体系结构无效,即1条指令(寄存器?)仅在同一时间同一地点由warp中的所有线程执行paralel@RobertCrovella为什么我们需要显式地添加这个pragma?编译器自己不能识别这样的循环吗?我并没有说必须显式地添加这个pragma。我只是链接到文档中的一个相关部分,以便其他人可以参考文档。如果你点击这个链接并阅读第一句话,你就会得到问题的答案。
for ( int i = 0; i < 5; i++ )
    b[i] = i;
b[0] = 0;
b[1] = 1;
b[2] = 2;
b[3] = 3;
b[4] = 4;
#pragma unroll
for(int i=0;i<SIZE;i++)  //or simply for(int i=0;i<100;i++)
    b[i]=i;