我是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个是被创建出来的吗?
size
到您的CUDA核函数。在您的核函数中,每个这100个线程都会执行for
循环100次。我建议您从基础开始逐步学习CUDA,而不是跳到更高级或不太重要的内容,比如循环展开。 - Farzad