CUDA記憶體簡介

2021-06-27 18:58:38 字數 1324 閱讀 1722

暫存器

暫存器是gpu片上快取記憶體, 執行單元可以以極低的延遲訪問暫存器。暫存器的基本單元式暫存器檔案,每個暫存器檔案大小為32bit。區域性儲存器對於每個執行緒,區域性儲存器也是私有的。如果暫存器被消耗完。資料將被儲存在區域性儲存器中。如果每個執行緒使用了過多的暫存器,或宣告了大型結構體或資料,或者編譯器無法確定資料的大小,執行緒的私有資料就有可能被分配到local memory中,乙個執行緒的輸入和中間變數將被儲存在暫存器或者是區域性儲存器中。區域性儲存器中的資料被儲存在視訊記憶體中,而不是片上的暫存器或者快取中,因此對local memory的訪問速度很慢。

共享儲存器

共享儲存器(share memeory)也是gpu片內快取儲存器。它是一塊可以被同一block中的所有執行緒訪問的可讀儲存器。使用關鍵字share新增到變數的宣告中,這將使這個變數駐留在共享記憶體中。cuda c編譯器對共享記憶體中的變數與普通變數將採取不同的處理方式。對於在gpu上啟動的每個執行緒塊,cuda c編譯器都將建立該變數的乙個副本,執行緒塊中的每乙個執行緒都共享這塊記憶體,但這個執行緒卻無法看到也不能修改其他執行緒塊的變數的副本。這就實現了一種非常好的方式,使得乙個執行緒塊中的多個執行緒能夠在計算上進行通訊和協作,而且,共享記憶體緩衝區駐留在物理gpu上,而不是駐留在gpu之外的系統記憶體中。

常量記憶體

__constant__將把變數的訪問限制為唯讀。在接受了這種限制之後,我們希望得到某種回報,與全域性記憶體中讀資料相比,從常量記憶體中讀取相同的資料可以節約記憶體的頻寬,主要有兩個原因:

-對常量記憶體的單次讀操作可以廣播到其他的「領進」執行緒,這將節約15次讀取操作。

-常量記憶體的資料快取起來,因此對相同位址的連續讀取操作將不會產生額外的記憶體通訊量。

「鄰近」是指半個warp中的執行緒。當處理常量記憶體時。nvidia硬體將把單次記憶體讀取操作廣播到每個半執行緒束。在半執行緒束中包含了16個執行緒,即執行緒束中數量的一半。如果在半執行緒束中的每乙個執行緒訪問相同的常量記憶體位址。那麼gpu只會發生一次讀操作事件並在隨後將資料廣播到每個執行緒。如果從常量記憶體中讀取大量的資料,那麼這種方式產生的記憶體流量只是全域性記憶體時的1/16.然而,當使用常量記憶體時也可能產生負面影響。如果半執行緒束的所有16個執行緒需要訪問常量記憶體中不同的資料,那麼這個16次讀取操作會被序列化,從而需要16倍的時間來發出請求。但如果從全域性記憶體中讀取,那麼這些請求會同時發出。在這種情況下,從常量記憶體讀取就慢於從全域性記憶體中讀取。

全域性儲存器

全域性儲存器(global memeory)位於視訊記憶體(佔據了大部分的視訊記憶體),gpu, cpu, 都可以進行讀取訪問嗎。整個網格中的任意執行緒都能讀寫全域性儲存器的任意位置。在目前的架構中,全域性儲存器沒有快取。

CUDA記憶體使用

cuda執行緒可以在執行過程中從多中記憶體空間訪問資料,分為三個層次 1,區域性記憶體 每乙個執行緒有其私有的區域性記憶體。2,共享記憶體 每乙個執行緒塊 thread block 有乙個共享記憶體,可以被該執行緒塊中的所有執行緒訪問。3,全域性記憶體 所有的執行緒都能訪問。此外還有兩個能被所有執行...

CUDA記憶體拷貝

1 cudamemcpy cudamalloc 線性記憶體拷貝 1 線性記憶體拷貝 2 cudamalloc void dev a,data size 3 cudamemcpy dev a,host a,data size,cudamemcpyhosttodevice 2 cudamemcpy2d ...

CUDA 共享記憶體

於gpu上啟動的每個執行緒塊上的共享記憶體,cuda c編譯器都會建立該變數的乙個副本。同一執行緒塊的每個執行緒都共享這塊記憶體,但是執行緒無法看到也不能修改其他執行緒塊中的共享記憶體。這樣做可以使得乙個執行緒塊中的多個執行緒能夠在計算上通訊和協作。共享記憶體緩衝區駐留在物理gup上,因此訪問共享記...