NVIDIA 架构:CUDA 线程和线程块

Posted

技术标签:

【中文标题】NVIDIA 架构:CUDA 线程和线程块【英文标题】:NVIDIA Architecture: CUDA threads and thread blocks 【发布时间】:2020-08-29 01:19:55 【问题描述】:

这主要来自《计算机体系结构:定量方法》一书。

这本书指出 32 个线程组在所谓的线程块中分组并一起执行,但显示了一个函数调用的示例,每个线程块有 256 个线程,并且 CUDA 的文档指出您最多可以有每个线程块 512 个线程。

函数调用如下所示:

int nblocks = (n+255)/256
daxpy<<<nblocks,256>>>(n,2.0,x,y)

谁能解释一下线程块的结构?

【问题讨论】:

docs.nvidia.com/cuda/cuda-c-programming-guide/… 您正在混合扭曲和黑色尺寸的概念。在上面链接的官方编程指南中阅读有关 CUDA 执行模型的信息,并查看this discussion 以及在互联网上很容易找到的许多其他讨论。此外,每个块最多可以有 1024 个线程。查看deviceQuery 打印输出的限制。 【参考方案1】:

我认为这个问题有点不清楚。我将强调线程扭曲和线程块之间的区别,我认为这很重要,希望它有助于回答真正的问题。

每个 warp 的线程数由硬件定义。通常,线程扭曲是 32 个线程宽(NVIDIA),因为 GPU 上的 SIMD 单元正好有 32 个执行通道,每个通道都有自己的 ALU(据我所知,情况并非总是如此;有些架构只有 16 个通道即使螺纹经线是 32 宽)。

线程块的大小是用户定义的(尽管受硬件限制)。硬件仍将在 32 宽的线程扭曲中执行线程代码。某些 GPU 资源,例如共享内存和同步,不能在 GPU 上的任何两个线程之间任意共享。但是,如果线程属于同一个线程块,GPU 将允许线程共享更大的资源子集。这就是为什么使用线程块背后的主要思想。

【讨论】:

谢谢。我遇到的问题是了解线程块和扭曲之间的区别。

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

CUDA线程和块解释

块中的 CUDA 最大线程数

线程块网格和多处理器

如何在 VS 2010 中使用 Nvidia NSight 查看 CUDA 线程值?

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

CUDA:每个多处理器的线程数和每个块的线程数的区别是啥? [复制]