【发布时间】:2014-04-12 06:50:26
【问题描述】:
我是 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;
}
上面是我的内核函数。在main 我这样称呼它
int main()
{
float * a; //host array
float * b; //device array
int size=100;
a=(float*)malloc(size*sizeof(float));
cudaMalloc((float**)&b,size);
cudaMemcpy(b, a, size, cudaMemcpyHostToDevice);
kernel<<<1,size>>>(b,size); //size=100
cudaMemcpy(a, b, size, cudaMemcpyDeviceToHost);
for(int i=0;i<size;i++)
cout<<a[i]<<"\t";
_getch();
return 0;
}
这是否意味着我有size*size=10000 个线程正在运行来执行程序?展开循环时会创建 100 个吗?
【问题讨论】:
-
没有。这意味着您调用了一个带有一个块的 CUDA 内核,并且一个块有 100 个活动线程。您将
size作为第二个函数参数传递给内核。在您的内核中,这 100 个线程中的每一个都执行for循环 100 次。我建议你从基础开始学习 CUDA,然后循序渐进,而不是跳到更高级或更不重要的材料,如循环展开。 -
@Farsad,谢谢,您能解释一下#pragma unroll 的作用吗?我认为我可以在不使用 pragma 的情况下执行 for 循环?
标签: cuda nvidia pragma loop-unrolling