我有一些我不了解CUDA的东西。我知道有'虚拟'变量称为线程。
编程内核时,线程变量自动运行,内核为每个线程反复运行。 (到目前为止?)
现在,如果我按照这样的方式编程:
for (int i = 0 ; i<100; i++){
....
}
每个线程都反复运行吗?或者只是一次?
答案 0 :(得分:5)
您放入内核函数的每个代码(以__global__
为前缀)都将由所有并发线程执行(在内核启动时指定了大量线程)。在内核主体中,您可以根据其全局标识符或本地标识符来区分线程的计算:
表示1D(可能是您的情况):
本地标识符:int tid = threadIdx.x
全球标识符:int tid = blockIdx.x*blockDim.x + threadIdx.x
进一步澄清:
如果你有这个内核:
__global__ void dummy(int *out){
for(int i=0; i<100; i++){
...
}
}
并且您想要启动4096个并发线程,您应该将线程组织成线程块(以利用局部性并解决硬件限制)。如果将4096个线程分成256个线程的线程块,则可以运行此大量线程来执行dummy
函数:
dummy<<<4096/256, 256>>>(output_array);
dummy
函数将由4096个线程执行,每个线程一个,串行或并行,具体取决于硬件(真实GPU)。您应该假设所有线程并行运行。您可以使用线程标识符(全局)区分线程计算,如上所述。