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)
提前致谢!
我认为最简单的方法就是用零填充最后的块:
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,对吧?)
但是,因为我似乎是唯一一个在可能的情况下主张使用现有调优库的人 - 为什么不使用CUBLAS或MAGMA而不是自己动手?它们很快,并经过数百名用户的测试.
| 归档时间: |
|
| 查看次数: |
4617 次 |
| 最近记录: |