平行計算之路 6 CUDA的軟體架構

2021-07-10 02:47:58 字數 2793 閱讀 7495

入門和gpu相關知識。作為開篇應該在完美不過了。

閱讀《cuda專家手冊》第三章硬體架構後的乙個筆記。之所以將目錄都打出來,因為這就是cuda的軟體架構。

從應用程式本身到cuda硬體上執行的cuda驅動程式。

驅動程式api和cuda執行時中的函式名稱分別以cu*()和cuda*()大頭。3對尖括號<<<>>>為啟用核心函式。

驅動程式版本可由cudrivergetversion()函式獲取。

呼叫cudevicegetcount()或cudagetdevicecount()函式查詢範圍為[0…devicecount - 1]的裝置可用。

cuda執行時程式可以執行在不能執行cuda的機器或未安裝cuda的機器上。如果cudagetdevicecount()函式返回cudasuccess和乙個非0的裝置數,cuda是可以用的。

上下文類似cpu中的程序,管理cuda程式中所有物件生命週期的容器,包括如下部分:

cudasetdevice()函式,為呼叫的執行緒設定當前上下文。

所有與cuda上下文相關的分配資源都在上下文被銷毀的同時被銷毀。

少數情況下,cuda不會預分配乙個給定操作所需的全部資源。

一組私有的虛擬記憶體位址,它可以分配線性裝置記憶體或用以對映鎖頁主機記憶體。

三個主要功能。

- 單執行緒應用程式可以驅動多個gpu上下文

- 庫可以建立並管理它們自己上下文,而不需要干涉呼叫者的上下文。

- 庫不知曉呼叫它的cpu執行緒資訊。

當前上下文棧的最初動機是使單執行緒cuda應用程式可以驅動多個cuda上下文。

類似於cpu中的malloc()和printf()函式,cuctxsetlimit()和cuctxgetlimit()函式可以設定和獲取核心函式中對應函式的gpu空間上限。cuctxsetcacheconfig()函式在啟動核心時指定所期望的快取配置。

模組是**與一同載入的資料的集合,類似於windows中的動態鏈結庫(dll)和linux中的動態共享物件(dso)。模組只在cuda驅動程式api中可用。

模組被載入,應用程式就可以查詢其中包含的資源:

- 全域性資源

- 函式(核心)

- 紋理引用

在.cu檔案中,用global標識核心。三對尖括號<<<>>>為啟用核心函式。

裝置記憶體(或線性裝置記憶體)駐留在cuda位址空間上,可以被cuda核心通過標準c/c++指標和陣列解引用操作訪問。cuda硬體並不支援請求式換頁,所以,所有的記憶體分配被真實的物理記憶體支援著。cuda記憶體分配在物理記憶體耗盡時會失敗。

流與事件使主機與裝置之間的記憶體複製與核心操作可併發執行。

cuda流被用來粗粒度管理多個處理單元的併發執行:

流的操作是按順序執行的,像cpu的執行緒。

軟體流水線解決因只有乙個dma引擎服務於gpu各種各樣的粗粒度硬體資源,應用軟體必須對多流中執行的操作進行流水操作。

克卜勒架構減少了軟體流水線操作的需求,hyper-q技術實際上消除了流水線需求。

不懂。null流失gpu上所有引擎的集結地,所有的流記憶體複製函式都是非同步的。null流最有用的場合是在不需要使用多流來利用gpu內部的併發性時,它可以解決應用程式的cpu/gpu併發。一旦流操作使用null流初始化,應用程式必須使用同步函式來確保操作在執行下一步之前完成。

cuda事件表示了另乙個同步機制。同cuda流一同引入,記錄cuda事件是cuda流中應用程式跟蹤進度的乙個方式。當之前的所有cuda流的操作執行結束後,全部的cuda事件通過寫入乙個共享同步記憶體位置而起作用。

主機記憶體(cpu記憶體)。在所有執行cuda的作業系統上,主機記憶體是虛擬化的。

為了便利dma,作業系統vmm(虛擬記憶體管理器)提供了乙個頁面鎖定功能。被vmm標記為鎖頁的記憶體就不能被換出,所以物理記憶體位址不能被修改。沒被鎖頁的記憶體稱作可換頁。

鎖頁主機記憶體由cuda函式cumemhostalloc()/cudahostalloc()分配。該記憶體是頁鎖定的並且由當前cuda上下文為dma設定。非同步記憶體複製操作只在鎖頁記憶體上工作。

在cuda中,鎖頁記憶體(pinned memory)是經過頁鎖定後且為硬體訪問而對映後的主機記憶體,而頁面鎖定(page-locking)只是作業系統的一種不允許換頁的機制。但是在作業系統文件中,這個兩個概念是同義的。

可分享頁內存在頁鎖定後對映給所有cuda上下文。

對映鎖頁記憶體對映到cuda上下文中的位址空間中,所以核心可能讀寫這塊記憶體。

用於開發者分配他們想要訪問的記憶體。

紋理引用可以把輸入的任何座標轉化到設定的輸出格式,表面引用則暴露了乙個常規的逐位操作介面來讀寫cuda陣列內容。

紋理引用是cuda用來設定紋理硬體解釋實際記憶體內容的物件。

表面引用可以是cuda核心使用表面載入/儲存內建函式讀寫cuda陣列。

圖形互操作性函式族使得cuda可以讀寫屬於opengl或direct3d api的記憶體。

驅動程式api沒有提供任何效能優勢,但它為應用程式提供了顯式的資源管理。

草草結束該章內容,沒有實際的操作真得讓人很容易犯睏。最後用一句話結束尾巴的內容——「當一位作家略去他所不知道的東西時,它們在作品中像漏洞似的顯示出來。」

參考:

《gpgpu程式設計技術——從glsl、cuda到opencl》♥♥♥♥♥

《數字影象處理高階應用——基於matlab與cuda的實現》♥♥♥

《基於cuda的並行程式設計》♥♥♥

《cuda專家手冊》♥♥♥♥♥

《高效能cuda應用設計與開發》♥♥♥♥

CUDA平行計算框架程式設計 矩陣相乘平行計算

當下的gpgpu general purpose gpu graphic process unit cuda compute unified device architecture 即通用計算圖形處理器。安裝過程可參考我的另一篇blog cuda軟體架構 1 開發庫 cuda library 2 執...

CUDA 程式設計 之平行計算思想

思想這個東西,是個人理解的問題。無論是 mpi openmp 等等平行計算的方法,都是使用多執行緒同時併發的執行。所謂併發,就是看起來一起執行罷了,在真正的單核cpu中,是在某段時間內,序列執行,通過執行緒排程來掩蓋其執行的順序。那麼cuda 程式設計中,平行計算的思想是simt,instructi...

CUDA 4 初探平行計算

本文將計算兩個向量 陣列 的和。分別在cpu和gpu上進行計算。平行計算 include include include using namespace std define n 200000 void add cpu int a,int b,int c global void add int a,...