一、先了解什麼是矩陣
在數學中,矩陣(matrix)是乙個按照長方陣列排列的複數或實數集合[1]
,最早來自於方程組的係數及常數所構成的方陣。
二、矩陣的基本引數
三、在cpu上使用c/c++進行矩陣程式設計typedef struct
matrix;
四、gpu使用cuda程式設計
簡單例子舉例:
這裡簡單介紹一下cuda的程式設計結構
先看**逐步解釋:
這裡的row與col讓人難受,與我們習以為常的x與y軸有點區別,讓人頭大不要擔心我會帶你們慢慢理順__global__ void matmulkernel(matrix a, matrix b, matrix c)
我們習以為常的row主列的矩陣,
int row = blockidx.y * blockdim.y + threadidx.y;
剛開始我特別不理解為什麼不是.x而是.y,反向思考如果確定了y,只有x可變時不就是代表著一行了嘛!(一下子轉不過來不要緊,多思考幾次就習慣了)
經過上述cpu矩陣運算示例,我們大致知道需要三次for迴圈才能完成矩陣運算!你們有沒有注意到這裡只使用了一次for迴圈就搞定了!是不是感覺哇塞,好酷!
接下來我們來解讀一下這乙個for迴圈:
相當簡單的乙個for迴圈語句,一共兩行**就描述了for (int e = 0; e < a.width; ++e)
cvalue += a.elements[row * a.width + e] * b.elements[e * b.width + col];
運算指令(與之前的cuda程式設計結構相對應)
row*a.width+e這代表著什麼,開始一直困惑著我和小夥伴討論過後弄明白了,如果你仔細看了我剛剛提到的x與y的關係時,你會醍醐灌頂,恍然大悟!確定了x值,變化著y值,表示這a矩陣的一列,e*b.width+col與之類似,自行思考;
看見這麼長的一段**,莫怕(我帶你慢慢分解):void matmul(const matrix a, const matrix b, matrix c)
第一步:申明變數,分配空間,賦值
第二步:呼叫kernel函式:matrix d_a;
d_a.width = a.width;
d_a.height = a.height;
size_t size = a.width * a.height * sizeof(float);
cudamalloc(&d_a.elements, size);
cudamemcpy(d_a.elements, a.elements, size,cudamemcpyhosttodevice);
第三步:釋放空間:dim3 dimblock(block_size, block_size);
dim3 dimgrid(b.width / dimblock.x, a.height / dimblock.y);
matmulkernel<<>>(d_a, d_b, d_c);
這只是我的一點點小小心得,如有錯誤歡迎您指出來,謝謝!cudafree(d_a.elements);
cudafree(d_b.elements);
cudafree(d_c.elements);
學習演算法之心得
1 演算法,浩如煙海,找到自己感興趣的那個分支,或那個點來學習,然後,一往無前的深入 下去。2 興趣第一,一切,由著你的興趣走,忌浮躁。3 思維敏捷。給你一道常見的題目,你的頭腦中應該立刻能冒出解決這道問題的最適用的資料結構,以及演算法。4 隨興趣,多刷題。acm題。poj,面試題,包括下文將出現的...
cuda矩陣相乘 CUDA的矩陣乘法
2 那麼下面就是不使用shared memory的並行化演算法的思路。簡單地來說,就是將上述可並行化的部分傳遞給gpu,使用cuda來計算。如下 void matrixmulondevice float m,float n,float p,intwidth int size width width ...
備戰「軟考」之心得
時間都去哪啦,還沒好好看書軟考就完啦!伴隨著5月24號16 30的鐘聲,標誌著準備將近2個月的軟考就這樣結束了!自己的心隨之啪的就碎了!儘管知道沒有賣懊悔藥的,但真的想讓時間倒流又一次來一次。但平靜之後就想這不過一次成長,沒有什麼懊悔的,更不要為此而感到傷心難過,我們須要做的就是總結這個過程中的經驗...