矩陣乘法公式:
( 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
2b2
j+.
..+a
ipb
pj時間複雜度:
c m∗
n=am
∗k∗b
k∗nc_=a_*b_
cm∗n=
am∗k
∗bk
∗n,時間複雜度為o(mkn)
c++**:
這一塊公司的同事和我說cuda有個建議值,這塊**不需要太多關注,接下來就到了cuda矩陣乘的**了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執行緒結構,我們採用自底向上的方式看
最小的單元是執行緒(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其中的二維矩陣的儲存是 按列儲存 一天都處於蒙蔽狀態,查了很...