cuda矩陣之心得

2021-08-03 21:02:49 字數 1899 閱讀 7723

一、先了解什麼是矩陣

在數學中,矩陣(matrix)是乙個按照長方陣列排列的複數或實數集合[1]

,最早來自於方程組的係數及常數所構成的方陣。

二、矩陣的基本引數

typedef struct 

matrix;

三、在cpu上使用c/c++進行矩陣程式設計

四、gpu使用cuda程式設計

簡單例子舉例:

這裡簡單介紹一下cuda的程式設計結構

先看**逐步解釋:

__global__ void matmulkernel(matrix a, matrix b, matrix c)

這裡的row與col讓人難受,與我們習以為常的x與y軸有點區別,讓人頭大不要擔心我會帶你們慢慢理順

我們習以為常的row主列的矩陣,

int row = blockidx.y * blockdim.y + threadidx.y;
剛開始我特別不理解為什麼不是.x而是.y,反向思考如果確定了y,只有x可變時不就是代表著一行了嘛!(一下子轉不過來不要緊,多思考幾次就習慣了)

經過上述cpu矩陣運算示例,我們大致知道需要三次for迴圈才能完成矩陣運算!你們有沒有注意到這裡只使用了一次for迴圈就搞定了!是不是感覺哇塞,好酷!

接下來我們來解讀一下這乙個for迴圈:

for (int e = 0; e < a.width; ++e)

cvalue += a.elements[row * a.width + e] * b.elements[e * b.width + col];

相當簡單的乙個for迴圈語句,一共兩行**就描述了

運算指令(與之前的cuda程式設計結構相對應)

row*a.width+e這代表著什麼,開始一直困惑著我和小夥伴討論過後弄明白了,如果你仔細看了我剛剛提到的x與y的關係時,你會醍醐灌頂,恍然大悟!確定了x值,變化著y值,表示這a矩陣的一列,e*b.width+col與之類似,自行思考;

void matmul(const matrix a, const matrix b, matrix c)

看見這麼長的一段**,莫怕(我帶你慢慢分解):

第一步:申明變數,分配空間,賦值

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);

第二步:呼叫kernel函式:

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個月的軟考就這樣結束了!自己的心隨之啪的就碎了!儘管知道沒有賣懊悔藥的,但真的想讓時間倒流又一次來一次。但平靜之後就想這不過一次成長,沒有什麼懊悔的,更不要為此而感到傷心難過,我們須要做的就是總結這個過程中的經驗...