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);
这是使内核并行的行。 gridDim
和 blockDim
用于告诉 GPU 启动了多少线程。
然后可以将每个启动的线程视为调用 __global__
函数。变量 blockIdx.x
、blockDim.x
和 threadIdx.x
允许您计算每个线程的唯一索引。
欢迎使用cuda编程。
假设您的网格有 10 个块,每个块有 64 个线程。对于每个线程:
blockIdx.x
告诉调用线程所属的块的id。
blockDim.x
是 64。
threadIdx.x
告诉调用线程的id
在其所属区块内。
现在我们经常想得到的是整个网格内的全局线程id,int index = blockIdx.x * blockDim.x + threadIdx.x;
就是这样得到的
我是 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);
这是使内核并行的行。 gridDim
和 blockDim
用于告诉 GPU 启动了多少线程。
然后可以将每个启动的线程视为调用 __global__
函数。变量 blockIdx.x
、blockDim.x
和 threadIdx.x
允许您计算每个线程的唯一索引。
欢迎使用cuda编程。
假设您的网格有 10 个块,每个块有 64 个线程。对于每个线程:
blockIdx.x
告诉调用线程所属的块的id。blockDim.x
是 64。threadIdx.x
告诉调用线程的id 在其所属区块内。
现在我们经常想得到的是整个网格内的全局线程id,int index = blockIdx.x * blockDim.x + threadIdx.x;
就是这样得到的