CUDA程式設計模型之記憶體管理

2022-08-30 07:57:07 字數 1169 閱讀 9472

cuda程式設計模型假設系統是由乙個主機和乙個裝置組成的,而且各自擁有獨立的記憶體。

主機:cpu及其記憶體(主機記憶體),主機記憶體中的變數名以h_為字首,主機**按照ansi c標準進行編寫

裝置:gpu及其記憶體(裝置記憶體),裝置記憶體中的變數名以d_為字首,裝置**使用cuda c標準進行編寫

乙個典型的cuda程式實現流程:

1.把資料從cpu記憶體拷貝到gpu記憶體

h_a=(float*)malloc(nbytes);

cudamalloc((float**)&d_a,nbytes);

2.呼叫核函式對儲存在gpu記憶體中的資料進行操作

3.將資料從gpu記憶體傳送回到cpu記憶體

說明:1.gpu記憶體分配:cudamalloc函式

函式原型:cudaerror_t cudamalloc(void** devptr, size_t size)

該函式負責向裝置分配一定位元組的線性記憶體,並以devptr的形式返回指向所分配記憶體的指標。

2.主機和裝置之間的資料傳輸:cudamemcpy函式

函式原型:cudaerror_t cudamemcpy(void* dst, const void* src, size_t count, cudamemcpykind kind)

該函式以同步方式執行,從src指向的源儲存區複製一定數量的位元組到dst指向的目標儲存區。複製方向由kind指定。

kind有四種選擇:cudamemcpyhosttohost、cudamemcpyhosttodevice、cudamemcpydevicetohost、cudamemcpydevicetodevice

如果gpu記憶體分配成功,函式返回cudasuccess;否則返回cudaerrormemoryallocation

可以使用cuda執行時函式將錯誤**轉化為可讀的錯誤資訊:char* cudageterrorstring(cudaerror_t error)

3.釋放gpu記憶體:cudafree函式

函式原型:cudaerror_t cudafree(void* devptr)

C C 程式設計之記憶體管理

1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器...

C C 程式設計之記憶體管理

記憶體分配方式 c語言中記憶體分配方式 1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元...

c 之記憶體模型

c 程式在執行時,將記憶體大方向劃分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...