我有一个关于 (py)CUDA 中块和网格尺寸的问题。我知道块的总大小有限制,但网格没有
并且实际的块大小会影响运行时间。但我想知道的是:如果我有一个由 256 个线程组成的块,像 (256,1) 一样启动它还是像 (128,2) 一样启动它,像 (64,4) 等等.
如果有区别:哪个是最快的?
是的,它有所作为。
(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 网格的内核并期望一切正常工作,反之亦然。