(py)CUDA中的网格和块尺寸

时间:2013-08-22 16:41:41

标签: cuda pycuda

我对(py)CUDA中的块和网格的尺寸有疑问。我知道块的总大小有限制,但网格没有限制

实际的块大小会影响运行时。但我想知道的是:如果我有一个256线程的块,启动它像(256,1)或启动它像(128,2),如(64,4)等,它会有所作为吗? 。

如果它有所不同:哪个最快?

1 个答案:

答案 0 :(得分:3)

是的,它有所不同。

(256,1)在X维度中创建一个包含256个线程的(1D)块,所有这些块的y索引都为0.

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

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

例如,如果您的内核代码以类似于:

的内容开头
int idx=threadIdx.x+blockDim.x*blockIdx.x;

并且不会创建任何其他索引变量,它可能假定为1D threadblock和1D grid。

另一方面,如果您的内核代码以类似于:

的内容开头
int idx = threadIdx.x+blockDim.x*blockIdx.x;
int idy = threadIdx.y+blockDim.y*blockIdx.y;

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

一般来说,这两种方法是不可互换的,这意味着你无法启动一个内核,它需要一个带有2D网格的一维网格,并期望一切正常工作,反之亦然。