关于CUDA编程模型的问题
Posted
技术标签:
【中文标题】关于CUDA编程模型的问题【英文标题】:Question on CUDA programming model 【发布时间】:2011-04-21 18:41:52 【问题描述】:您好,我是 CUDA 编程的新手,我有 2 个关于 CUDA 编程模型的问题。
简而言之,该模型表示存在线程、块和网格方面的内存层次结构。块内的线程具有共享内存并且能够轻松地相互通信,但如果它们在不同的块中则不能通信。 GPU 设备上还有一个全局内存。
我的问题是:
(1)为什么我们需要有这样一个由线程和块组成的内存层次结构?
这样,任何两个线程都可以在需要时相互通信,从而可能简化编程工作。
(2) 为什么设置线程只能达到 3D 配置而不超过 3D 配置?
谢谢。
【问题讨论】:
【参考方案1】:1) 这允许您拥有一个通用的编程模型,该模型支持具有不同数量处理器的硬件。它也是底层 GPU 硬件的反映,在内存访问和同步方面,块内的线程与不同块中的线程 WRT 不同。
线程可以通过全局内存或共享内存进行通信,具体取决于它们的块亲和性。您还可以使用同步原语,例如 __syncthreads。
2) 这是编程模型的一部分。我怀疑很大程度上是由于用户要求允许对 3 维问题进行数据分解,并且对进一步的维度支持的需求很少。
Cuda 编程指南涵盖了很多此类内容。还有几本书可用。 Programming Massively Parallel Processors: A Hands-on Approach 中有一个很好的讨论,讨论了为什么 GPU 硬件是这样的,以及它是如何反映在编程模型中的。
【讨论】:
听说CUDA 4.x系列的尺寸限制会有所变化。【参考方案2】:(1) 本地内存用于存储不适合寄存器的本地值。共享内存用于存储由线程共享的公共数据。本地内存+寄存器组成线程的执行上下文,共享内存是存储待处理数据的地方。
(2) 您可以轻松地使用 1D 来表示任何 D。例如,如果您有 1D 索引,您可以使用以下方法将其转换为 2D 空间:x = i % width, y = i / width
,反之则为 i = y*width + x
。为了您的方便,添加了 2D 和 3D。这与用 C++ 实现的 N-D 数组非常相似。
【讨论】:
以上是关于关于CUDA编程模型的问题的主要内容,如果未能解决你的问题,请参考以下文章