CUDA有本身的存儲器模型,線程在執行時將會訪問處處於多個不一樣存儲器空間中的數據。cuda應用程序開發中涉及8中存儲器,層次結果如圖所示:緩存
每個線程擁有本身的私有存儲器寄存器和局部存儲器;每個線程塊擁有一塊共享存儲器(shared_memory);最後,grid中全部的線程均可以訪問同一塊全局存儲器(global memory)。除此以外,還有兩種能夠被全部線程訪問的只讀存儲器:常數存儲器(constant memory)和紋理存儲器(Texture memory),他們分別爲不一樣的應用進行了優化。全局存儲器、常數存儲器和紋理存儲器中的值在一個內核函數執行完成後將被繼續保持,能夠被同一程序中的其餘內核函數調用。app
各種存儲器比較:函數
存儲器 | 位置 | 擁有緩存 | 訪問權限 | 變量生命週期 |
---|---|---|---|---|
register | GPU片內 | N/A | device可讀/寫 | 與thread相同 |
local_memory | 板載顯存 | 無 | device可讀/寫 | 與thread相同 |
shared_memory | CPU片內 | N/A | device可讀/寫 | 與block相同 |
constant_memory | 板載顯存 | 有 | device可讀,host可讀/寫 | 可在程序中保持 |
texture_memory | 板載顯存 | 有 | device可讀,host可讀/寫 | 可在程序中保持 |
global_memory | 板載顯存 | 無 | device可讀/寫,host可讀/寫 | 可在程序中保持 |
host_memory | host內存 | 無 | host可讀/寫 | 可在程序中保持 |
pinned_memory | host內存 | 無 | host可讀/寫 | 可在程序中保持 |
說明性能
(1)Register
和shared_memory
都是GPU片上的高速存儲器;優化
(2)經過mapped memory
實現的zero copy功能,某些功能GPU能夠直接在kernel中訪問page-locked memory。線程
GPU執行的是一種內存的加載/存儲模型(load-storage model),即全部的操做都要在指令載入寄存器以後才能執行,所以掌握GPU的存儲器模型對於GPU代碼性能的優化具備重要意義。code