CUDA中的非平方矩阵乘法

Ber*_*rdo 2 cuda matrix-multiplication

我在CUDA中用于矩阵乘法的代码允许我将正方形矩阵和非正方形矩阵相乘,但是,宽度和高度必须是块大小的倍数.

所以,例如,我可以乘[3] [6]*[6] [3](使用blocksize = 3),但我不能乘以[3] [2]*[2] [3].

有谁知道这样做的方法?这是我的内核:

#include <stdio.h>

#include <limits.h>

#include <stdlib.h>
#define blocksize 3
#define HM (1*blocksize) 
#define WM (2*blocksize) 
#define WN (1*blocksize)
#define HN WM 
#define WP WN   
#define HP HM  
#define PTH WM
#define PTW HM

__global__ void nonsquare(float*M, float*N, float*P, int uWM,int uWN)

{
__shared__ float MS[blocksize][blocksize];
__shared__ float NS[blocksize][blocksize];


int tx=threadIdx.x, ty=threadIdx.y, bx=blockIdx.x, by=blockIdx.y;
int rowM=ty+by*blocksize;
int colN=tx+bx*blocksize;
float Pvalue=0;


for(int m=0; m< uWM/blocksize;++m){
    MS[ty][tx]=M[rowM*uWM+(m*blocksize+tx)];
    NS[ty][tx]=M[colN + uWN*(m*blocksize+ty)];
    __syncthreads();

    for(int k=0;k<blocksize;k++)
        Pvalue+=MS[ty][k]*NS[k][tx];
    __syncthreads();
    P[rowM*WP+colN]=Pvalue;
     }
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Jon*_*rsi 5

我认为最简单的方法就是用零填充最后的块:

for(int m=0; m< uWM/blocksize;++m){
    colM = m*blocksize+tx;
    rowN = m*blocksize+ty;
    if (rowM > uWN || rowN > uWM || colM > uWM || colN > uWN) {
        MS[ty][tx]=0.;
        NS[ty][tx]=0.;
    } else {
        MS[ty][tx]=M[rowM*uWM+colM];
        NS[ty][tx]=N[colN + uWN*rowN];
    }
Run Code Online (Sandbox Code Playgroud)

加或减.(NS线应该引用N,而不是M,对吧?)

但是,因为我似乎是唯一一个在可能的情况下主张使用现有调优库的人 - 为什么不使用CUBLASMAGMA而不是自己动手?它们很快,并经过数百名用户的测试.