CUDA 常量記憶體

2021-10-10 09:47:05 字數 2163 閱讀 8234

常量記憶體的大小限定為64k,每個sm擁有8kb的常數儲存器快取,在編譯期時宣告一塊常量記憶體,需要用到__constant__關鍵字,例如

__constant__ float my_array[1024] = ;
不同於c/c++中的const常量,cuda中常量內存在宣告後是可以修改的。如果要在執行時改變常量記憶體中內容,只需要在呼叫gpu核心之前簡單地呼叫cudacopytosymbol函式。如果在編譯階段或主機端執行階段都沒有定義常量記憶體,那麼常量記憶體區將未定義。

使用預定義巨集__cuda_arch__來支援主機與裝置的常量記憶體複製,這會方便cpu和gpu對記憶體的讀取。

__constant__ double dc_vals[2] = ;

const double hc_vals[2] = ;

__device__ __host__ double f(size_t i)

cuda執行時應用程式可以使用函式cudamemecpytosymbol()和cudamemcpyfromsymbol()分別複製資料到常量記憶體和從常量記憶體複製資料。常量記憶體的指標可以使用cudagetsymboladdress()函式查詢。

驅動程式api應用程式可以使用函式cumoduleglobal()查詢常量記憶體的裝置指標。由於驅動程式api不包括cuda執行時的語言整合特性。驅動程式api不包括像cudamemcpytosymbol()這樣的特殊記憶體複製函式。所以必須使用cumodulegetglobal()查詢位址,之後使用cumemcpyhtod()或cumemcpydtoh().

__constant__ char p_hellocuda[11]

;__constant__ int t_hellocuda[11]

=;__constant__ int num =11;

__global__ static

void

hellocuda

(char

* result)

}int

main

(int argc,

char

* ar**)

;cuda_safe_call

(cudamalloc

(void**

)&device_result,

sizeof

(char)*

11);cuda_safe_call

(cudamemcpytosymbol

(p_hellocuda, hellocuda,

sizeof

(char)*

11));

hellocuda<<

<1,

1,0>>

>

(device_result)

;cut_check_error

("kernel excution failed\n");

cuda_safe_call

(cudamemcpy

(&host_result, device_result,

sizeof

(char)*

11, cudamemcpydevicetohost));

;printf

("%s\n"

, host_result)

;cuda_safe_call

(cudafree

(device_result));

cut_exit

(argc, ar**)

;return0;

}

注意到定義常量儲存器時,需要將其定義在所有函式之外,作用範圍為整個檔案,並且對主機端和裝置端函式都可見。同時,上述**中說明了使用常量記憶體的兩種方法。

__constant__ int t_hellocuda[11] = ;

__constant__ int num = 11;

__constant__ char p_hellocuda[11]; // 宣告

...// 使用cudamemcpytosymbol進行賦值

cuda_safe_call(cudamemcpytosymbol(p_hellocuda, hellocuda, sizeof(char) * 11));

...

CUDA學習 記憶體處理之常量記憶體(4)

常量記憶體,顧名思義,它是唯讀記憶體。這種型別的記憶體要麼是在編譯時宣告為唯讀記憶體,要麼是在執行時通過主機端定義為唯讀記憶體。常量只是從gpu記憶體的角度而言。在編譯時宣告一塊常量記憶體,需要用到const關鍵字。常量記憶體其實只是全域性記憶體的一種虛擬位址形式,並沒有特殊保留的常量記憶體塊。常量...

CUDA記憶體使用

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

CUDA記憶體簡介

暫存器 暫存器是gpu片上快取記憶體,執行單元可以以極低的延遲訪問暫存器。暫存器的基本單元式暫存器檔案,每個暫存器檔案大小為32bit。區域性儲存器對於每個執行緒,區域性儲存器也是私有的。如果暫存器被消耗完。資料將被儲存在區域性儲存器中。如果每個執行緒使用了過多的暫存器,或宣告了大型結構體或資料,或...