关于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编程模型的问题的主要内容,如果未能解决你的问题,请参考以下文章

CUDA编程CUDA内存模型

CUDA编程CUDA内存模型

笔记CUDA - (异步)SIMT 架构

计算机组成原理 — GPU — CUDA 编程模型

CUDA C编程权威指南 第三章:CUDA执行模型

CUDA编程模型