【问题标题】:Cuda Programming in comparision with C ProgrammingCuda 编程与 C 编程的比较
【发布时间】:2015-07-09 06:10:21
【问题描述】:

我是 cuda 编程的新手。我在理解 cuda 代码方面几乎没有问题。我正在通过这个链接浏览 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;是如何进行并行处理的@有人可以解释一下吗?

【问题讨论】:

    标签: c cuda parallel-processing


    【解决方案1】:

    欢迎来到 cuda 编程。

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

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

    现在我们经常想要的是整个网格内的全局线程IDint index = blockIdx.x * blockDim.x + threadIdx.x; 是我们获取它的方式。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 为什么是 blockIdx.x * blockDim.x + threadIdx.x ?而不是别的什么? blockId与blockDim相乘加到threadId是什么意思
      • 一个网格被划分为一个块,每个块被划分为线程。 threadIdx 在块中是唯一的,blockIdx 在网格中是唯一的。在一维中(如您的情况),每个线程都可以有一个从 0->blockDim.x 的 threadIdx.x。为了确保唯一的index,第二个块(即blockIdx.x == 1)需要将索引偏移blockDim.x,给出indexblockDim.x->2*blockDim.x
      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多