网格和块尺寸(py)CUDA

网格和块尺寸(py)CUDA,cuda,pycuda,Cuda,Pycuda,我有一个关于(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索引范围为0到1

我有一个关于(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索引范围为0到127,y索引范围为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;
并且不创建任何其他索引变量,它可能假设为1D threadblock和1D grid

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

int idx=threadIdx.x+blockDim.x*blockIdx.x;
int idx = threadIdx.x+blockDim.x*blockIdx.x;
int idy = threadIdx.y+blockDim.y*blockIdx.y;
它可能需要二维网格和二维螺纹块


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

这一点很清楚。我的问题更多:考虑到实现,是否存在性能差异?或者仅仅是为了方便程序员使用更自然的方法对矩阵、卷等进行索引?如果总线程数相同,则不会因线程维度而产生性能差异。机器产生相同数量的翘曲。唯一的区别是分配给每个线程的特定内置变量(例如threadIdx.x等)。实际上我也读了该线程,但它没有回答我的问题,因为讨论的只是块的总大小以及如何在理想情况下确定它。我的问题是:如果我取块大小为256并以(256,1,1)或(128,2,1)或(64,2,2)的方式调用它,是否会产生(性能)差异。当然,给出了一个经过调整的实现。