我对(py)CUDA中的块和网格的尺寸有疑问。我知道块的总大小有限制,但网格没有限制
实际的块大小会影响运行时。但我想知道的是:如果我有一个256线程的块,启动它像(256,1)或启动它像(128,2),如(64,4)等,它会有所作为吗? 。
如果它有所不同:哪个最快?
答案 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网格的一维网格,并期望一切正常工作,反之亦然。