我在CUDA中用於矩陣乘法的代碼可以讓我乘以正方形和非正方形矩陣,但寬度和高度必須是塊大小的倍數。因此,例如,我可以乘[3] [6] * [6] [3](使用塊大小= 3),但我不能乘以[3] [2] * [2] [3 ]。CUDA中的非正方形矩陣乘法
有沒有人知道一種方法來做到這一點?這是我的核心:
#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;
}
}
在此先感謝!
這似乎是一個好點,雖然因爲我使用矩陣代表醫學圖像,我不確定如果用零填充將影響圖像。但我會試一試。至於使用CUBLAS,我一直在閱讀它,但我有點擔心它有很多新的語法(學習曲線高嗎?)。但是我會盡一切努力的。感謝您的回覆;) – Bernardo 2011-03-28 16:16:39
陣列只在矩陣乘法例程中被填充。它們不會被傳回,並且它們不會影響最終結果,因爲您只是向矩陣元素添加零。至於CUBLAS(或岩漿,或其他) - 學習曲線是真實的,但事後你不必編寫自己的線性代數例程,而且性能是一個賣點...... – 2011-03-28 17:29:43
我明白了......我將很快處理的事情之一是非常大(不適合GPU卡存儲器)3D矩陣,CUBLAS庫可以消除3D索引和內存分配的痛苦(我認爲第一個問題是比第二個更可行)? – Bernardo 2011-03-28 17:41:20