Cuda线程和循环

use*_*270 2 cuda

我有一些我不了解CUDA的东西.我知道有'虚拟'变量称为线程.

编程内核时,线程变量自动运行,内核为每个线程反复运行.(到目前为止正确吗?)

现在,如果我编程这样的事情:

for (int i = 0 ; i<100; i++){
....
}
Run Code Online (Sandbox Code Playgroud)

每个线程都会一遍又一遍地运行吗?或者只是一次?

las*_*gar 6

您放入内核函数(前缀为__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++){
        ...
      }
    }
Run Code Online (Sandbox Code Playgroud)

如果要启动4096个并发线程,则应将线程组织成线程块(以利用局部性并解决硬件限制).如果将4096个线程分成256个线程的线程块,则可以通过以下命令运行此大量线程来执行该dummy函数:

dummy<<<4096/256, 256>>>(output_array);
Run Code Online (Sandbox Code Playgroud)

dummy功能将由4096个线程执行,每个线程一个,串行或并行,具体取决于硬件(真实GPU).您应该假设所有线程并行运行.您可以使用线程标识符(全局)区分线程的计算,如上所述.