在CUDA中设置DimGrid和DimBlock

时间:2015-04-09 19:09:58

标签: cuda

我在CUDA中进行矩阵乘法。以下设置有效:

int TILE = 8;
dim3 DimGrid((numCColumns - 1)/TILE + 1, (numCRows - 1)/TILE + 1, 1);
dim3 DimBlock(TILE, TILE, 1);

但是如果我对整个图像使用一个块,它将返回全零。这是什么原因?假设一个块可以包含整个图像(输入为64x64)。

dim3 DimGrid(1,1,1);
dim3 DimBlock(numCColumns, numCRows, 1);

这就是我在main函数中调用kernel的方法:

matrixMultiply<<<DimGrid, DimBlock>>>(deviceA, deviceB, deviceC,
                                        numARows, numAColumns,
                                        numBRows, numBColumns,
                                        numCRows, numCColumns);

和内核:

__global__ void matrixMultiply(float * A, float * B, float * C,
                   int numARows, int numAColumns,
                   int numBRows, int numBColumns,
                   int numCRows, int numCColumns) {
    //@@ Insert code to implement matrix multiplication here
    int Row = blockIdx.y * blockDim.y + threadIdx.y;
    int Col = blockIdx.x * blockDim.x + threadIdx.x;

    if ((Row < numCRows) && (Col < numCColumns))
    {
        float value = 0.0;
        for (int i = 0; i < numAColumns; i++)
            value += A[Row * numAColumns + i] * B[i*numBColumns + Col];
        C[Row * numCColumns + Col] = value;
    }
}

1 个答案:

答案 0 :(得分:3)

  

但是如果我对整个图像使用一个块,它将返回全零。这是什么原因?

CUDA线程块为limited to a maximum of 1024 threads(请参阅“每个块的最大线程数”)。对于多维线程块,这意味着维度的乘积必须小于或等于1024(对于cc2.x和更新的GPU)。

对于64x64图像,这不起作用:

dim3 DimBlock(numCColumns, numCRows, 1);

因为numCColumns * numCRows大于1024。

如果你在代码中执行proper cuda error checking,你会得到一个指示(由于内核配置参数无效,你的内核启动失败)。