CUDA練習 矩陣乘法

2021-10-05 06:47:28 字數 1812 閱讀 9429

矩陣乘法公式:

( 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_

cm∗n​=

am∗k

​∗bk

∗n​,時間複雜度為o(mkn)

c++**:

void

matrixmulcpu

(int

* a,

int* b,

int* c )

}```

對應的cuda**需要先指定執行緒塊數和每個執行緒塊內的執行緒數

```cpp

dim3 threads_per_block (16,

16,1)

;// a 16 x 16 block threads

dim3 number_of_blocks (

(n / threads_per_block.x)+1

,(n / threads_per_block.y)+1

,1);

matrixmulgpu <<

< number_of_blocks, threads_per_block >>

>

( a, b, c_gpu )

;

這一塊公司的同事和我說cuda有個建議值,這塊**不需要太多關注,接下來就到了cuda矩陣乘的**了

這個地方需要理解cuda執行緒結構,我們採用自底向上的方式看

最小的單元是執行緒(thread)

接下來是block,每個block中有多個thread,採用二維編號,如上圖的橘黃色的thread(2,1)代表該block的第7個執行緒

再向上一層是grid(格線),每個grid裡有多個block,如上圖的黃色的block(2,0)

在我們的**裡面我們使用(blockidx.x * blockdim.x + threadidx.x,blockidx.y * blockdim.y + threadidx.y)來定位到具體的執行緒,接下來就是具體某個執行緒執行的**,從而實現了並行

最後需要使用cudadevicesynchronize(); // wait for the gpu to finish before proceeding等待所有執行緒都結束,才能繼續

grid最多有3dim,block最多有3dim,上述**z的維度都是指定的1,所以在cuda**中沒有提到blockidx.z

關於這塊這個部落格講的挺好

cuda矩陣相乘 CUDA的矩陣乘法

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

CUDA之矩陣乘法 複數

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

cuda 矩陣乘法函式之cublasSgemm

可以考慮使用,例如cublassgeam 矩陣加法 進行一次1.0 at 0.0 b的引數設定,利用內建的轉置功能 注意這裡的1和0 來進行將a轉換成at.在使用cuda的cublas庫中矩陣乘法函式cublassgemm時,注意到cuda其中的二維矩陣的儲存是 按列儲存 一天都處於蒙蔽狀態,查了很...