如何实现NxM CUDA矩阵乘法?

时间:2016-03-04 15:14:34

标签: c cuda

我已经在几个页面上搜索了这个,但我只找到了NxN矩阵的实现。

如何定义dimBlockdimGrid来计算? 另外,如何玩:

int row = blockIdx.y*blockDim.y+threadIdx.y;
int col = blockIdx.x*blockDim.x+threadIdx.x;

各自的限制?

1 个答案:

答案 0 :(得分:4)

对于天真的矩阵乘法,它非常简单。非方矩阵乘法必须采用以下形式:

C(rowsA x colsB) = A(rowsA x colsA) x B(colsA x colsB)
   (m)     (n)        (m)      ^          ^      (n)
                               |          |
                             must be the same

结果的行和列限制(mxn)以及所需的线程数组的大小由输出矩阵大小简单定义,输出矩阵大小由A的行和B的列定义。因此,m=rowsA=rowsCn=colsB=colsC。像这样:

template <typename T>
__global__ void mm_kernel(const T *A, const T *B, T *C, int m, int n, int colsA){

  int row = blockIdx.y*blockDim.y+threadIdx.y;
  int col = blockIdx.x*blockDim.x+threadIdx.x;
  T sum = 0;
  if ((row < m) && (col < n)){
    for (int i = 0; i < colsA; i++) sum += A[colsA*row + i] * B[i*n+col];
    C[row*n+col] = sum;}
}

在您的主机代码中,您需要创建一个这样的网格:

const int m = 1000; // determines size of output matrix
const int n = 2000; 
const int blkdim = 16;
dim3 dimBlock(blkdim,blkdim);
dim3 dimGrid((n+dimBlock.x-1)/dimBlock.x, (m+dimBlock.y-1)/dimBlock.y);

(以上所有内容均在浏览器中编码,未经测试)

如果您尝试制作shared-memory optimized version,对于非方形尺寸,这会变得非常复杂。但如果您的表现符合您的要求,则应使用CUBLAS