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

Posted

技术标签:

【中文标题】(py)CUDA中的网格和块尺寸[重复]【英文标题】:Grid and Block dimension in (py)CUDA [duplicate] 【发布时间】:2013-08-25 12:44:56 【问题描述】:

我有一个关于 (py)CUDA 中块和网格的尺寸的问题。我知道块的总大小有限制,但网格没有限制

并且实际的块大小会影响运行时。但我想知道的是:如果我有一个 256 个线程块,像 (256,1) 一样启动它还是像 (128,2) 一样启动它,像 (64,4) 等一样.

如果有区别:哪个最快?

【问题讨论】:

其实我也读过那个帖子,但是它没有回答我的问题,因为讨论只是关于块的总大小以及如何在理想情况下确定它。我的问题是:如果我采用 256 的块大小并在 (256,1,1) 或 (128,2,1) 或 (64,2, 2)时尚。当然,给定一个适应的实现。 【参考方案1】:

是的,这很重要。

(256,1) 在 X 维度创建一个由 256 个线程组成的 (1D) 块,所有线程的 y 索引均为 0。

(128,2) 创建一个 128x2 线程的 (2D) 块,即。 x 维度为 128,y 维度为 2。这些线程的 x-index 范围从 0 到 127,y-index 范围从 0 到 1

内核代码的结构必须包含线程索引/编号。

例如,如果您的内核代码以以下内容开头:

int idx=threadIdx.x+blockDim.x*blockIdx.x;

并且不创建任何其他索引变量,它可能假设一维线程块和一维网格。

另一方面,如果您的内核代码以以下内容开头:

int idx = threadIdx.x+blockDim.x*blockIdx.x;
int idy = threadIdx.y+blockDim.y*blockIdx.y;

它可能需要一个 2D 网格和 2D 线程块。

一般而言,这两种方法是不可互换的,这意味着您不能启动一个期望 1D 网格和 2D 网格的内核并期望一切正常工作,反之亦然。

【讨论】:

这很清楚。我的问题更多:鉴于实施已适应,是否存在性能差异?还是只是为了方便程序员能够使用更自然的方式来索引矩阵、卷等? 如果总线程数相同,则由于线程尺寸没有性能差异。机器产生相同数量的经纱。唯一的区别是分配给每个线程的特定内置变量(例如 threadIdx.x 等)。

以上是关于(py)CUDA中的网格和块尺寸[重复]的主要内容,如果未能解决你的问题,请参考以下文章

计算内核的网格和块尺寸

CUDA线程和块解释

CSS 网格和媒体查询 [重复]

与 CUDA 中的线程和块并行化

CUDA笔记(一)线程与数据量的关系

删除重复数据 Python