内核网格大小是不是决定块数,而块大小决定线程数?

Posted

技术标签:

【中文标题】内核网格大小是不是决定块数,而块大小决定线程数?【英文标题】:Does a kernels grid size determine the number of blocks, and the blocksize determine the numbers of threads?内核网格大小是否决定块数,而块大小决定线程数? 【发布时间】:2014-11-02 08:10:05 【问题描述】:

我似乎无法理解 CUDA 内核参数 <<<gridSize, blockSize>>> 的措辞

在我正在审查的代码中,它们被定义为

const dim3 blockSize(1, 1, 1); 
const dim3 gridSize( 1, 1, 1); 

用变量引用替换硬编码的 1,如果它们被这样命名,它们是否正确命名

const dim3 blockSize(nThreadsX, nThreadsY, nThreadsZ); 
const dim3 gridSize(nBlocksX, nBlocksY, nBlocksZ); 

blockSize 的任何参数可以设置的最大值由硬件设置(例如 512 或 1024?),并且是将在块中运行的最大线程数在单个维度中?

【问题讨论】:

【参考方案1】:

是的,建议的命名是明智的。那些dim3 参数旨在表示 (x,y,z) 尺寸。块由线程组成。网格由块组成。

使用您的命名,nBlocksXnBlocksYnBlocksZ 都必须小于相应的硬件定义限制。这些限制可以从 programming guide(表 12)中发现,也可以使用 deviceQuery 示例应用程序中包含的方法以编程方式发现。

nThreadsXnThreadsYnThreadsZ 也有类似的限制,但此外,产品 nThreadsX * nThreadsY * nThreadsZ 还必须满足另一个限制 ( Maximum number of threads per block,对于当前的 CUDA GPU 硬件,它是 512 或 1024。

【讨论】:

以上是关于内核网格大小是不是决定块数,而块大小决定线程数?的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 估计每个块的线程数和 2D 网格数据的块数

计算内核的网格和块尺寸

在决定线程池大小时,如何理解“将每个任务需要的资源加起来并将其划分为可用的总数”

java多线程

为啥允许我运行块数超过 GPU 的 CUDA 核心数的 CUDA 内核?

Day793.合理设置线程池大小 -Java 性能调优实战