全域性記憶體
通俗意義上的裝置記憶體。
共享記憶體
1. 位置:裝置記憶體。
2. 形式:關鍵字
__shared__新增到變數宣告中。如
__shared__ float cache[10]
3. 目的:對於gpu上啟動的每個執行緒塊,cuda c編譯器都將建立該共享變數的乙個副本。執行緒塊中的每個執行緒都共享這塊記憶體,但執行緒卻無法看到也不能修改其他執行緒塊的變數副本。這樣使得乙個執行緒塊中的多個執行緒能夠在計算上通訊和協作。
常量記憶體
1. 位置:裝置記憶體
2. 形式:關鍵字
__constant__新增到變數宣告中。如
__constant__ float s[10]
3. 目的:為了提公升效能。常量記憶體採取了不同於標準全域性記憶體的處理方式。在某些情況下,用常量記憶體替換全域性記憶體能有效地減少記憶體頻寬。
4. 特點:常量記憶體用於儲存在核函式執行期間不會發生變化的資料。變數的訪問限制為唯讀。nvidia硬體提供了64kb的常量記憶體。不再需要cudamalloc()或者cudafree(),而是在編譯時,靜態地分配空間。
5. 要求:當我們需要拷貝資料到常量記憶體中應該使用
cudamemcpytosymbol(),而
cudamemcpy()會複製到全域性記憶體。
6. 效能提公升的原因:
6.1. 對常量記憶體的單次讀操作可以廣播到其他的「鄰近」執行緒。這將節約15次讀取操作。(為什麼是15,因為「鄰近」指半個執行緒束,乙個執行緒束包含32個執行緒的集合。)
6.2. 常量記憶體的資料將快取起來,因此對相同位址的連續讀操作將不會產生額外的記憶體通訊量。
紋理記憶體
1. 位置:裝置記憶體
2. 目的:能夠減少對記憶體的請求並提供高效的記憶體頻寬。是專門為那些在記憶體訪問模式中存在大量空間區域性性的圖形應用程式設計,意味著乙個執行緒讀取的位置可能與鄰近執行緒讀取的位置「非常接近」。如下圖:
3. 紋理變數(引用)必須宣告為檔案作用域內的全域性變數。
4. 形式:分為一維紋理記憶體 和 二維紋理記憶體。
4.1. 一維紋理記憶體
4.1.1. 用texture《型別》型別宣告,如texturetexin。
4.1.2. 通過cudabindtexture()繫結到紋理記憶體中。
4.1.3. 通過tex1dfetch()來讀取紋理記憶體中的資料。
4.1.4. 通過cudaunbindtexture()取消繫結紋理記憶體。
4.2. 二維紋理記憶體
4.2.1. 用texture《型別,數字》型別宣告,如texturetexin。
4.2.2. 通過cudabindtexture2d()繫結到紋理記憶體中。
4.2.3. 通過tex2d()來讀取紋理記憶體中的資料。
4.2.4. 通過cudaunbindtexture()取消繫結紋理記憶體。
固定記憶體
1. 位置:主機記憶體。
2. 概念:也稱為頁鎖定記憶體或者不可分頁記憶體,作業系統將不會對這塊記憶體分頁並交換到磁碟上,從而確保了該記憶體始終駐留在物理記憶體中。因此作業系統能夠安全地使某個應用程式訪問該記憶體的實體地址,因為這塊記憶體將不會破壞或者重新定位。
3. 目的:提高訪問速度。由於gpu知道主機記憶體的實體地址,因此可以通過「直接記憶體訪問dma(direct memory access)技術來在gpu和主機之間複製資料。由於dma在執行複製時無需cpu介入。因此dma複製過程中使用固定記憶體是非常重要的。
4. 缺點:使用固定記憶體,將失去虛擬記憶體的所有功能;系統將更快的耗盡記憶體。
5. 建議:對cudamemcpy()函式呼叫中的源記憶體或者目標記憶體,才使用固定記憶體,並且在不再需要使用它們時立即釋放。
6. 形式:通過cudahostalloc()函式來分配;通過cudafreehost()釋放。
7. 只能以非同步方式對固定記憶體進行複製操作。
原子性
1. 概念:如果操作的執行過程不能分解為更小的部分,我們將滿足這種條件限制的操作稱為原子操作。
2. 形式:函式呼叫,如atomicadd(addr,y)將生成乙個原子的操作序列,這個操作序列包括讀取位址addr處的值,將y增加到這個值,以及將結果儲存回位址addr。
CUDA學習 GPU記憶體
通俗意義上的裝置記憶體 位置 裝置記憶體。形式 關鍵字 shared 新增到變數宣告中。如 shared float cache 10 目的 對於gpu上啟動的每個執行緒塊,cuda c編譯器都將建立該共享變數的乙個副本。執行緒塊中的每個執行緒都共享這塊記憶體,但執行緒卻無法看到也不能修改其他執行緒...
GPU共享記憶體小結 pycuda
先來點題外話,由於導師的要求使用gpu加速但是又沒有系統的學習就開始了使用pycuda進行gpu的程式設計,變用邊學。在優化程式的時候shared memory是必用的,所以理解共享記憶體是個什麼東西才可以做到自己對資料是如何跑的有數。先看看這張gpu的儲存結構圖 偷的圖,哈哈 在圖中我們關心的重點...
記憶體管理分類
在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在c 程式中,把記憶體分為4 類,程式儲存區 靜態資料儲存...