我已经在几个页面上搜索了这个,但我只找到了NxN矩阵的实现。
如何定义dimBlock
和dimGrid
来计算?
另外,如何玩:
int row = blockIdx.y*blockDim.y+threadIdx.y;
int col = blockIdx.x*blockDim.x+threadIdx.x;
各自的限制?
答案 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=rowsC
和n=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。