2

我对 CUDA 有一些不明白的地方。我知道有称为线程的“虚拟”变量。

在对内核进行编程时,线程变量会自动运行,并且内核会为每个线程一遍又一遍地运行。(到目前为止正确吗?)

现在,如果我编写这样的程序:

for (int i = 0 ; i<100; i++){
....
}

它是否为每个线程一遍又一遍地运行?还是只有一次?

4

1 回答 1

6

您放入内核函数的每个代码(以 为前缀__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)。您应该假设所有线程都在并行运行。如上所述,您可以使用线程标识符(全局)区分线程的计算。

于 2012-11-20T10:07:16.430 回答