为啥 CUDA 中网格中的所有块的 Blockdim 都应该相同?

Posted

技术标签:

【中文标题】为啥 CUDA 中网格中的所有块的 Blockdim 都应该相同?【英文标题】:Why should Blockdim be the same for all blocks in a grid in CUDA?为什么 CUDA 中网格中的所有块的 Blockdim 都应该相同? 【发布时间】:2013-08-23 19:43:56 【问题描述】:

为什么blockDim,块中的线程总数,对于CUDA程序中网格中的所有块都相同?我知道如果所有块的块大小都相同,索引将非常容易,但如果我有大小为 32 倍数的块(对于扭曲)但按递增顺序,则可能 AP 或 GP 索引非常容易。

使网格的所有块大小相同的原因是什么?

【问题讨论】:

什么 AP 和 GP 索引? 这是 CUDA 的限制。这里有合适的 SO 编码问题吗? 【参考方案1】:

如果您有多个不同大小的块都运行相同的内核,那么在 SM 上较大的块很可能比较小的块花费更长的时间。与均匀分布的工作负载相比,这会显着减慢您的代码。在某种程度上,它们会阻止你在脚上开枪。

我还冒昧地猜测它极大地简化了它们的内存管理 - 使用统一的块大小,每个块都需要在 SM 上分配固定数量的共享内存/寄存器等。

可变块大小似乎是可能的,但没有根据。如果您担心在块上做无用的工作,请不要担心。如果您不在网格范围内,只需提早退出区块即可 - 对性能的影响微乎其微。

【讨论】:

以上是关于为啥 CUDA 中网格中的所有块的 Blockdim 都应该相同?的主要内容,如果未能解决你的问题,请参考以下文章

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

CUDA 中每个块的数据——它是不是在一个事务中广播?

CUDA编程之线程模型

确定 CUDA 中#pragma unroll N 的最佳值

CUDA C/C++ 教程一:加速应用程序

CUDA C/C++ 教程一:加速应用程序