[英]How to implement a NxM CUDA matrix multiplication?
我已經在幾頁上進行了搜索,但是我只找到了NxN矩陣的實現。
如何定義dimBlock
和dimGrid
來計算? 另外,如何玩:
int row = blockIdx.y*blockDim.y+threadIdx.y;
int col = blockIdx.x*blockDim.x+threadIdx.x;
有各自的限制?
對於朴素的矩陣乘法,這是微不足道的。 非方陣乘法必須采用以下形式:
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);
(以上所有內容均在瀏覽器中編碼,未經測試)
如果嘗試制作共享內存優化版本 ,則對於非正方形大小,這將變得更加復雜。 但是,如果您追求的是性能,則應該使用CUBLAS 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.