我对 CUDA 有一些不明白的地方。我知道有称为线程的“虚拟”变量。
在对内核进行编程时,线程变量会自动运行,并且内核会为每个线程一遍又一遍地运行。(到目前为止正确吗?)
现在,如果我编写这样的程序:
for (int i = 0 ; i<100; i++){
....
}
它是否为每个线程一遍又一遍地运行?还是只有一次?
我对 CUDA 有一些不明白的地方。我知道有称为线程的“虚拟”变量。
在对内核进行编程时,线程变量会自动运行,并且内核会为每个线程一遍又一遍地运行。(到目前为止正确吗?)
现在,如果我编写这样的程序:
for (int i = 0 ; i<100; i++){
....
}
它是否为每个线程一遍又一遍地运行?还是只有一次?
您放入内核函数的每个代码(以 为前缀__global__
)都将由所有并发线程(线程数量在内核启动时指定)执行。在内核体中,您可以根据线程的全局标识符或局部标识符来区分线程的计算:
对于一维(可能是您的情况):
本地标识符: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)。您应该假设所有线程都在并行运行。如上所述,您可以使用线程标识符(全局)区分线程的计算。