本文參考:《cuda programming guides》,《professional cuda c programming》
整體結構將主要分為邏輯結構,物理結構兩個方面進行理解:
首先一定要對怎麼cpu與gpu異構模型有一定的了解,cpu 與 gpu通過中間的pci匯流排進行連線和傳輸。根據前文nvcc的編譯過程,我們可以了解到,乙個.cu檔案經過編譯之後會更具不同的硬體轉化為其相對應的2進製檔案,分開傳到cpu 和 gpu進行非同步執行。如下圖:
為了方便程式設計和理解,cuda根據gpu硬體設計了相應的程式設計模型,分別分為 grid、block、thread三個層次,如圖:
乙個grid中有多個block,乙個block有多個執行緒。他們具有層次性,且他們有各自的操作範圍,可以設定不同的維度,有利於程式的控制與理解。結合上面的異構模型,當主程式傳送乙個核心函式時,就是傳送對應乙個grid。這裡可以人為便於自己的定義block,thread的數量和維數。
為什麼會有利於程式的控制理解呢?首先要先理解2個圖:
每個thread都分配有相應的暫存器和本地記憶體。在乙個block中又有乙個共享記憶體,對於block內的thread時可見的,且shared memory的讀取速度很快。對於整個grid有供所有block和thread訪問的全域性、常量、紋理記憶體,後兩個記憶體是對thread唯讀的,且只能通過host端進行賦值設定。
初步了解了cuda的邏輯模型,那這些thread是怎麼進行執行的呢?
還是以圖來理解比較直觀,乙個gpu有多個流式多處理器(sm :streaming multiproeessors )組成,如圖:
乙個sm多個cuda核心,每個cuda核心能並行執行乙個thread。此外可以看到(左圖)sm圖中有2個執行緒束排程器,乙個sm的排程單位就是乙個warp:32*thread(程序束 = 32個執行緒)進行執行的,也就是說乙個sm最多同時執行32個thread。多個sm就構成了乙個gpu。
結合右圖和上面的邏輯結構內容,我們可以更好理解邏輯結構與裝置結構的對應關係。乙個grid(網格)會被對映到整個gpu,乙個grid中的多個block會被分配到不同的sm中;乙個block會被切割成多個warp,這意味著乙個sm可以"併發"執行多個block,可以「併發」執行多個warp;在一般情況下,thread會佔據sm的所有cuda核心,進行並行運算。
注意:每個sm的暫存器和shared memory都是有限的,當乙個block的thread很多時,每個thread被分配的暫存器就少了。同理,更多的block那每個block就有更少的shared memory。
CUDA學習(四)初探
cuda核函式與執行時引數 核函式是gpu每個thread上執行的程式。必須通過 gloabl 函式型別限定符定義。形式如下 global void kernel param list 核函式只能在主機端呼叫,呼叫時必須申明執行引數。呼叫形式如下 ernel dg,db,ns,s param lis...
CUDA學習系列教程(四)
gpu程式一般步驟 過程中,一般要盡量降低資料通訊的消耗,所以如果程式需要複製大量的資料到gpu,顯然不是很合適使用gpu運算,最理想的情況是,每次複製的資料很小,然後運算量很大,輸出的結果還是很小,複製回cpu。核函式是gpu每個thread上執行的程式。必須通過 gobal 函式型別限定符定義。...
Fabric學習 Fabric整體專案結構介紹
參考版本較低,建議去看高版本手冊。bccsp 提供了加密標準以及演算法的實現,為整個專案提供統一的加密 簽名 驗籤服務。common common模組提供了通用功能以及一些通用的 實現,包括日誌 錯誤 工具包等,主要包括專案全域性的功能性 core core模組為fabric專案的核心 模組,其中包...