簡體   English   中英

如何實現NxM CUDA矩陣乘法?

[英]How to implement a NxM CUDA matrix multiplication?

我已經在幾頁上進行了搜索,但是我只找到了NxN矩陣的實現。

如何定義dimBlockdimGrid來計算? 另外,如何玩:

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=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);

(以上所有內容均在瀏覽器中編碼,未經測試)

如果嘗試制作共享內存優化版本 ,則對於非正方形大小,這將變得更加復雜。 但是,如果您追求的是性能,則應該使用CUBLAS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM