Cuda编程与C编程的比较

Cuda Programming in comparision with C Programming

我是 cuda 编程新手。我在理解 cuda 代码方面几乎没有问题。我正在阅读这个 link 中的 cuda 教程:cuda - tutorial

基本上,因为他们试图将数组传递给函数并将 7 分配给该数组的每个索引。在 C 语言中,我们通常会使用 for 循环

  for(int index = 0; index < num_elements; ++index)
  {
    array[index] = 7;
  }

在 CUDA 中,教程说它是这样完成的:

__global__ void kernel(int *array)
{
  int index = blockIdx.x * blockDim.x + threadIdx.x;

  array[index] = 7;
}

它说 int index = blockIdx.x * blockDim.x + threadIdx.x; 行类似于用 c 编写的 for 循环,除了 for 是顺序的,而在 cuda 中它是并行完成的。我不明白并行处理是如何完成的 int index = blockIdx.x * blockDim.x + threadIdx.x; 谁能解释一下?

在 CUDA 代码的某处应该有一个内核调用看起来像这样:

kernel <<< gridDim, blockDim >>> (array);

这是使内核并行的行。 gridDimblockDim 用于告诉 GPU 启动了多少线程。

然后可以将每个启动的线程视为调用 __global__ 函数。变量 blockIdx.xblockDim.xthreadIdx.x 允许您计算每个线程的唯一索引。

欢迎使用cuda编程。

假设您的网格有 10 个块,每个块有 64 个线程。对于每个线程:

  • blockIdx.x 告诉调用线程所属的块的id。
  • blockDim.x 是 64。
  • threadIdx.x 告诉调用线程的id 在其所属区块内。

现在我们经常想得到的是整个网格内的全局线程idint index = blockIdx.x * blockDim.x + threadIdx.x;就是这样得到的