CUDA线程和块解释

Posted

技术标签:

【中文标题】CUDA线程和块解释【英文标题】:CUDA threads and blocks explanation 【发布时间】:2015-03-16 08:34:05 【问题描述】:

我一直在关注这里的教程 http://www.nvidia.com/docs/IO/116711/sc11-cuda-c-basics.pdf

尝试自学基本的 GPU 编程。我还是不太了解块和线程的拓扑结构。在第 42 页,代码定义尺寸数据如下:

#define N (2048*2048)
#define THREADS_PER_BLOCK 512

本教程是否做出假设?我目前正在使用带有 Nvidia 520m GPU 的笔记本电脑。使用结构 cudaDeviceProp 我能够确定我能够在每个块中运行 1024 个线程。 2048x2048 究竟量化了什么?块数?我怎么知道这是否正确?

【问题讨论】:

【参考方案1】:

N (2048*2048) 数量是数据集的整体大小。这个问题是向量相加问题,所以要相加的向量总大小为N个元素。

每个块的线程数已在 512 处定义。

块的数量可以从内核启动中确定:

add<<<N/THREADS_PER_BLOCK,THREADS_PER_BLOCK>>>(d_a, d_b, d_c);
       ^                          ^  
    number of blocks            number of threads in each block

所以网格中正在启动的总块数是 2048*2048/512 = 8192

这些特定参数(每个块 512 个线程,总共 8192 个块)应该与任何当前可用的 CUDA GPU 兼容。

【讨论】:

好的,如果我理解正确的话。这个 2048*2048 是一个保守的数据集大小或线程总数。一种适用于所有当前 GPU 的产品。当我运行 GPU Z 时得到这个信息。 1 个多处理器(48 核) 每个 MP 线程 1536 个线程 每个块 1024 个线程尺寸 1024x1024x64 网格尺寸 65535x65535x65535 这是否意味着我应该能够以每块 1024 个线程和 1024x1024x64 个线程运行。还是我限制在 1536 个线程,这将远远少于此代码指定的? 我强烈建议您阅读 c 编程指南的前几节。 你不限于 1536 个线程。 CUDA 线程块不必同时调度。无论硬件允许的程度如何,它们都可以一个接一个地安排。正如我已经说过的,8192 个 512 个线程的块应该在任何当前可用的 CUDA GPU 上工作,包括你的。在单个 SO 问题或一组 cmets 的空间中,不可能为您提供完整的 CUDA 教程。 别担心。无论如何感谢您的帮助。我只需要四处寻找一个提供更多细节的教程。 Christian,您指的是哪个编程指南?这是英伟达开发者网站上的吗?

以上是关于CUDA线程和块解释的主要内容,如果未能解决你的问题,请参考以下文章

CUDA中的线程和块结构以及如何分配具有不同结构的线程(c ++)

与 CUDA 中的线程和块并行化

CUDA 线程、SMX、SP 和块,它们是如何工作的?

CUDA编程之线程模型

cuda 共享内存和块执行调度

(py)CUDA中的网格和块尺寸[重复]