CUDA學習 GPU記憶體

2021-09-22 19:04:04 字數 1208 閱讀 5124

通俗意義上的裝置記憶體

位置:裝置記憶體。

形式:關鍵字__shared__新增到變數宣告中。如__shared__ float cache[10]。

目的:對於gpu上啟動的每個執行緒塊,cuda c編譯器都將建立該共享變數的乙個副本。執行緒塊中的每個執行緒都共享這塊記憶體,但執行緒卻無法看到也不能修改其他執行緒塊的變數副本。這樣使得乙個執行緒塊中的多個執行緒能夠在計算上通訊和協作。

位置:裝置記憶體

形式:關鍵字__constant__新增到變數宣告中。如__constant__ float s[10];。

目的:為了提公升效能。常量記憶體採取了不同於標準全域性記憶體的處理方式。在某些情況下,用常量記憶體替換全域性記憶體能有效地減少記憶體頻寬。

特點:常量記憶體用於儲存在核函式執行期間不會發生變化的資料。變數的訪問限制為唯讀。nvidia硬體提供了64kb的常量記憶體。不再需要cudamalloc()或者cudafree(),而是在編譯時,靜態地分配空間。

要求:當我們需要拷貝資料到常量記憶體中應該使用cudamemcpytosymbol(),而cudamemcpy()會複製到全域性記憶體。

效能提公升的原因:

位置:裝置記憶體

目的:能夠減少對記憶體的請求並提供高效的記憶體頻寬。是專門為那些在記憶體訪問模式中存在大量空間區域性性的圖形應用程式設計,意味著乙個執行緒讀取的位置可能與鄰近執行緒讀取的位置「非常接近」。

紋理變數(引用)必須宣告為檔案作用域內的全域性變數。

形式:分為一維紋理記憶體 和 二維紋理記憶體。

4.2. 二維紋理記憶體

位置:主機記憶體。

概念:也稱為頁鎖定記憶體或者不可分頁記憶體,作業系統將不會對這塊記憶體分頁並交換到磁碟上,從而確保了該記憶體始終駐留在物理記憶體中。因此作業系統能夠安全地使某個應用程式訪問該記憶體的實體地址,因為這塊記憶體將不會破壞或者重新定位。

目的:提高訪問速度。由於gpu知道主機記憶體的實體地址,因此可以通過「直接記憶體訪問dma(direct memory access)技術來在gpu和主機之間複製資料。由於dma在執行複製時無需cpu介入。因此dma複製過程中使用固定記憶體是非常重要的。

缺點:使用固定記憶體,將失去虛擬記憶體的所有功能;系統將更快的耗盡記憶體。

建議:對cudamemcpy()函式呼叫中的源記憶體或者目標記憶體,才使用固定記憶體,並且在不再需要使用它們時立即釋放。

形式:通過cudahostalloc()函式來分配;通過cudafreehost()釋放。

只能以非同步方式對固定記憶體進行複製操作。

GPU計算與CUDA程式設計

1.來自nvidia的 cuda 並行程式設計框架是 gpgpu 正規化的一種特定的實現。它提供了gpu程式設計的簡易介面,基於cuda程式設計可以構建基於gpu計算的應用程式。2.cuda 在技術上是一種異構計算環境,也就是說它利用了同時在 cpu 和 gpu 上的協調計算。cuda 架構由主機 ...

CUDA學習筆記一 GPU基本架構

以fermi gpu為例 左側是乙個粗略的gpu架構圖,可以看到gpu由 視訊記憶體 和 計算單元 組成,有以下幾個部分 dram dynamic random access memory,即gpu的視訊記憶體,容量較大,速度慢,cpu和gpu都可以訪問。dram相當於cpu的ram,裡面存放的資料...

CUDA拷貝二維陣列到GPU記憶體中

cuda 複雜問題 細節問題 解答 見 cuda複雜問題 細節問題 解答 網上沒找到如何拷貝二維陣列到gpu的例程,所以我就自己寫乙個,其實原理也很簡單,就是用三維指標匯入給二維指標分配記憶體。先說一下我們的目標 匯入到gpu乙個二維陣列 dev data arraynum mwidth mheig...