关于CUDA编程模型的问题

时间:2011-04-21 18:41:53

标签: cuda

您好我是CUDA编程的新手,我对CUDA编程模型有两个问题。

简而言之,该模型表示在线程,块和网格方面存在内存层次结构。块内的线程具有共享内存,并且能够轻松地相互通信,但如果它们位于不同的块中则无法通信。 GPU设备上还有一个全局内存。

我的问题是:

(1)为什么我们需要有一个由线程组成的内存层次结构?

这样,如果需要,任何两个线程都可以相互通信,因此可能简化编程工作。

(2)为什么限制只设置线程到3D配置而不是超出?

谢谢。

2 个答案:

答案 0 :(得分:3)

1)这使您可以使用支持具有不同处理器数量的硬件的通用编程模型。它也反映了底层GPU硬件,它将块内的线程与不同块WRT中的线程区别对待,以便进行内存访问和同步。

线程可以通过全局内存或共享内存进行通信,具体取决于它们的块关联性。您也可以使用同步原型,如__syncthreads。

2)这是编程模型的一部分。我怀疑主要是由于用户需要允许对三维问题进行数据分解,并且几乎不需要进一步的维度支持。

Cuda编程指南涵盖了很多这类内容。还有几本书可供使用。在Programming Massively Parallel Processors: A Hands-on Approach中有一个很好的讨论,它讨论了为什么GPU硬件是这样的,以及如何在编程模型中反映出来。

答案 1 :(得分:0)

(1)本地存储器用于存储不适合寄存器的本地值。共享内存用于存储由线程共享的公共数据。本地内存+寄存器组成线程的执行上下文,共享内存是存储要处理的数据。

(2)您可以轻松使用1D来表示任何D.例如,如果您有1D索引,则可以使用:x = i % width, y = i / width将其转换为2D空间,反向为i = y*width + x。为方便起见,添加了2D和3D。它与用C ++实现的N-D数组非常相似。