簡介:
本文介紹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 ...