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

2021-07-03 10:51:37 字數 2779 閱讀 7175

**

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

▲圖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 共享儲存器實現矩陣相乘

共享儲存器使用 shared 限定詞分配。cuda程式設計介面 執行初始化與裝置儲存器 cuda程式設計介面 使用nvcc編譯器的相容性 cuda程式設計介面 如何用nvcc編譯cuda程式 cuda程式設計模型 儲存器層次和異構程式設計 cuda程式設計模型 核心與執行緒層次概述 正如在前面的文章...

CUDA的儲存器結構

因為寫部落格主要想記錄比較感興趣的點,所以可能順序不那麼通常 通暢。cuda c有共享記憶體 shared memory 它的關鍵字是 share 新增了該關鍵字的變數表明該變數是乙個共享變數。共享記憶體被乙個執行緒塊內的所有執行緒共享,塊內線程可以修改它的值,它的生命週期和它所在的執行緒塊一樣。因...

CUDA學習筆記之 CUDA儲存器模型

gpu片內 register,shared memory 板載視訊記憶體 local memory,constant memory,texture memory,texture memory,global memory host 記憶體 host memory,pinned memory.cuda儲...