【问题标题】:Grid and Block dimension in (py)CUDA [duplicate](py)CUDA中的网格和块尺寸[重复]
【发布时间】: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)时尚。当然,给定一个适应的实现。

标签: cuda pycuda


【解决方案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 等)。
猜你喜欢
  • 2011-08-14
  • 2015-09-17
  • 2012-04-16
  • 2011-01-24
相关资源
最近更新 更多