CUDA 共享儲存器實現矩陣相乘

2021-06-18 17:37:34 字數 3150 閱讀 5280

共享儲存器使用__shared__限定詞分配。

cuda程式設計介面:執行初始化與裝置儲存器

cuda程式設計介面:使用nvcc編譯器的相容性

cuda程式設計介面:如何用nvcc編譯cuda程式

cuda程式設計模型:儲存器層次和異構程式設計

cuda程式設計模型:核心與執行緒層次概述

正如在前面的文章提到的,共享儲存器應當比全域性儲存器更快,詳細內容將在後續文章中介紹。任何用訪問共享儲存器取代訪問全域性儲存器的機會應當被發掘,如下面的矩陣相乘例子展示的那樣。 下面的**是矩陣相乘的乙個直接的實現,沒有利用到共享儲存器。每個執行緒讀入a的一行和b的一列,然後計算c中對應的元素,如圖1所示。這樣,a讀了b.width次,b讀了a.height次。

#include#include#include

#pragma comment(lib, "cudart.lib")

#pragma comment(lib, "cutil32.lib")

bool initcuda(void)

for(i = 0; i < count; i++)

}} if(i == count)

cudasetdevice(i);

printf("cuda initialized.\n");

return true; 

}///

#define thread_num 256

#define matrix_size 100 //方陣階

▲圖1 沒有使用共享儲存器的矩陣相乘

下面的例子**利用了共享儲存器實現矩陣相乘。本實現中,每個執行緒塊負責計算乙個小方陣csub,csub是c的一部分,而塊內的每個執行緒計算csub的乙個元素。如圖2所示。csub等於兩個長方形矩陣的乘積:a的子矩陣尺寸是(a.width,block_size),行索引與csub相同,b的子矩陣的尺寸是(block_size,a.width),列索引與csub相同。為了滿足裝置的資源,兩個長方形的子矩陣分割為尺寸為block_size的方陣,csub是這些方陣積的和。每次乘法的計算是這樣的,首先從全域性儲存器中將二個對應的方陣載入共享儲存器中,載入的方式是乙個執行緒載入乙個矩陣元素,然後乙個執行緒計算乘積的乙個元素。每個執行緒積累每次乘法的結果並寫入暫存器中,結束後,再寫入全域性儲存器。

採用這種將計算分塊的方式,利用了快速的共享儲存器,節約了許多全域性儲存器頻寬,因為在全域性儲存器中,a只被讀了(b.width/block_size)次同時b讀了(a.height/block_size)次。

▲圖2 使用共享儲存器的矩陣相乘

CUDA程式設計介面 共享儲存器實現矩陣相乘

正如在前面的文章提到的,共享儲存器應當比全域性儲存器更快,詳細內容將在後續文章中介紹。任何用訪問共享儲存器取代訪問全域性儲存器的機會應當被發掘,如下面的矩陣相乘例子展示的那樣。下面的 是矩陣相乘的乙個直接的實現,沒有利用到共享儲存器。每個執行緒讀入a的一行和b的一列,然後計算c中對應的元素,如圖1所...

CUDA矩陣相乘

include include include include 並行矩陣乘法kernel函式 global void matrixmultiply int m d,int n d,int p d,int width p d row width col p 每個執行緒計算p d矩陣的乙個元素 生成隨機...

cuda矩陣相乘 CUDA的矩陣乘法

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