首页 文章

(py)CUDA中的网格和块维[重复]

提问于
浏览
1

这个问题在这里已有答案:

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

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

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

1 回答

  • 3

    是的,它有所不同 .

    (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;
    

    并且不会创建任何其他索引变量,它可能假定为1D线程块和1D网格 .

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

    int idx = threadIdx.x+blockDim.x*blockIdx.x;
    int idy = threadIdx.y+blockDim.y*blockIdx.y;
    

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

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

相关问题