CUDA使用筆記(一)矩陣乘法

2021-08-19 17:08:06 字數 2435 閱讀 9438

簡介

本文介紹cublassgemm()函式的使用。在c/c++中,通常我們將2維矩陣按行儲存為一維陣列。但是在視訊記憶體中,矩陣是按列儲存的。因此,我們在實際使用時,對cublassgemm()中的各個引數的賦值可能會搞不清楚。

本文,以乙個具體的矩陣乘法案例為例子,介紹cublassgemm()函式的使用。

正文:

我們以下圖所示的矩陣運算為例進行講解。

因為gpu視訊記憶體中,矩陣是按列進行儲存的。如果我們在gpu中直接計算f=d×e的話,那麼將結果矩陣從視訊記憶體中取出

放回記憶體中時,記憶體中實際儲存的則是ft。

因此,如果我們能夠計算ft=et× dt,那麼我們將結果取回記憶體時,記憶體中儲存的剛好就是矩陣f。

基於上述的解釋,我們在gpu中實際計算的是ft=et× dt,取回記憶體後,剛好是我們需要的結果f。

好的,下面我們說一下,怎麼使用cublassgemm()函式計算ft=et× dt 。

cublassgemm()函式的輸入引數如下所示

cublasstatus_t cublassgemm (

cublashandle_t handle,

cublasoperation_t transa,

cublasoperation_t transb,

int m,

int n,

int k,

const float *alpha, /* host or device pointer */

const float *a,

int lda,

const float *b,

int ldb,

const float *beta, /* host or device pointer */

float *c,

int ldc);

上述函式直接計算的是c=alpha*a×b+beta*c

transa的值一般取cublas_op_n或cublas_op_t,分別表示視訊記憶體中a是否轉置;

transb的值同理。

m為a矩陣的列,n為b矩陣的行,k為a矩陣的行(b矩陣的列)。

lda、ldb、ldc分別表示a、b、c矩陣的列。

綜上所述,結合實際例子,我們可以知道各個引數的取值。

因為我們計算的是ft=et× dt,因此a矩陣取e,b矩陣取d,

transa取cublas_op_n,transb取cublas_op_n。alpha=1,beta=0。

e矩陣是2×3,d矩陣是3×2,因此m=3(e的列),n=3(d的行),k=2(e的行或者d的列。

lda =3(e的列),ldb=2(d的列),ldc=3(f的列)。

實際呼叫情況如下

cublassgemm(handle,cublas_op_n, cublas_op_n, 3, 3, 2, &alpha, e, 3, d, 2, &beta,f, 3);

完整測試程式如下,注意,部分引數名字可能與上面所述有出入。

#include #include #include #include #include int main(void)  

; float h_e[6]=;

float h_f[9];

float *d_d,*d_e,*d_f;

cudamalloc((void**)&d_d,6*sizeof(float));

cudamalloc((void**)&d_e,6*sizeof(float));

cudamalloc((void**)&d_f,9*sizeof(float));

cudamemcpy(d_d,&h_d,6*sizeof(float),cudamemcpyhosttodevice);

cudamemcpy(d_e,&h_e,6*sizeof(float),cudamemcpyhosttodevice);

cudamemset(d_f,0,9*sizeof(float));

cublashandle_t handle;

cublascreate(&handle);

cublassgemm(handle,cublas_op_n,cublas_op_n,3,3,2,&alpha,d_e,3,d_d,2,&beta,d_f,3);

cudamemcpy(h_f,d_f,9*sizeof(float),cudamemcpydevicetohost);

for(int i=0;i<9;i++)

printf("\n");

return 0;

}

cuda矩陣相乘 CUDA的矩陣乘法

2 那麼下面就是不使用shared memory的並行化演算法的思路。簡單地來說,就是將上述可並行化的部分傳遞給gpu,使用cuda來計算。如下 void matrixmulondevice float m,float n,float p,intwidth int size width width ...

CUDA練習 矩陣乘法

矩陣乘法公式 ab ij k 1 paik bkj ai1b 1j a i2b2 j ai pbpj ab sum a b a b a b a b ab ij k 1p aik bkj ai1 b1j ai 2 b2 j a ip b pj 時間複雜度 c m n am k b k nc a b c...

CUDA之矩陣乘法 複數

做好矩陣乘法和轉置之後本來開心得不行的!準備上手做個最基本的波束形成了!突然發現希爾伯特變換完以後需要進行各種複數的運算 所以臨時補寫了乙個複數乘法 學著學著好像有點感覺了 還是蠻有意思的。當然前提是能除錯成功。用一句傅小姐的名言鼓勵一下 只要心甘情願任何事情都會變得簡單!device float ...