CUDA 全域性記憶體的區別與用法

2021-08-14 07:05:06 字數 1674 閱讀 8057

cuda程式設計中全域性記憶體分為分頁記憶體,固定記憶體,零拷貝記憶體,統一虛擬定址,統一記憶體位址。

一.分頁記憶體

利用malloc()申請的主機記憶體,即可分頁記憶體。

特點:可分頁記憶體傳輸資料到裝置時,首先需要分配固定記憶體,再傳遞到裝置端。

對主機而言,分頁記憶體可提高主機效能。

float* data;

malloc((void**)&data,sizeof(float)*n);

二.固定記憶體(pinned)- 鎖頁記憶體

利用cudamallochost()申請固定記憶體。

特點:裝置可直接訪問固定記憶體,可提高傳輸效能,如圖所示。

三.零拷貝記憶體

利用cudahostalloc()申請零拷貝記憶體。使用情況:(1)裝置不足時,可利用主機記憶體;(2)避免裝置和主機間的顯式傳輸;   (3)提高pci-e傳輸率。

特點:通常,主機無法訪問裝置變數,裝置無法訪問主機變數,但主機和裝置均可訪問零拷貝記憶體。

float* data;

cudahostalloc((void**)&data,n*sizeof(float),unsigned int flags);

flags有4種:cudahostallocdefalt,

cudahostallocportable,

cudahostallocwritecombined,

最後一種標示就是零拷貝記憶體。

使用方式:

1.主機訪問零拷貝記憶體:直接使用可以。

2.裝置訪問零拷貝記憶體:利用cudagetdevicepointer((void**)&deviceptr,void* hostptr,unsiged int flag)獲取裝置零拷貝主機記憶體對應的裝置指標,然後將裝置指標傳入kernel函式。裝置就可直接訪問主機記憶體了。

四.統一虛擬位址

利用cudahostalloc()獲取的零拷貝記憶體,在uva(統一虛擬位址)之前,核函式使用的指標必須為經過cudagetdevicepointer()獲得的裝置指標。而有了uva之後,則省去了這一步,核函式可直接使用主機指標。

如圖所示。

五.統一記憶體位址

利用cudamallocmanaged()申請託管記憶體,「統一記憶體

」建立了乙個託管記憶體池,記憶體池中已分配的空間,可以用相同的記憶體位址(指標)

在cpu和gpu上進行訪問。

float* data;

cudamallocmanaged((void**)&data,sizeof(float)*n,unsiged int flags)

特點:完成了主機與裝置資料的自動拷貝,消除重複指標。

虛擬記憶體布局 記憶體的分工 堆與棧

程序的虛擬記憶體空間分為兩個部分。低2gb 或3gb 由應用程式使用。高2gb 或1gb 由系統核心程式使用。系統核心的記憶體空間中包含驅動程式,系統核心可執行程式 用於記憶體管理的資料結構 頁資料夾 頁表等 用於程序管理 執行緒排程的資料結構 各種中斷處理程式,系統快取等。應用程式可使用的低位址空...

全域性變數與區域性變數在記憶體中的區別

全域性變數儲存在記憶體的全域性儲存區中,占用靜態的儲存單元 區域性變數儲存在棧中,只有在所在函式被呼叫時才動態地為變數分配儲存單元。該題目考查的知識點是變數的儲存型別及性質。c語言經過編譯之後將記憶體分為以下幾個區域 2 堆 heap 用於程式動態申請分配和釋放空間。c語言中的malloc和free...

Mybatis 與 的區別與用法

區別 這種傳參,自帶 沒有sql注入的風險,而 傳入的時候不帶 有sql注入額風險 的用法 多用於模糊查詢,或者特定的 需要傳入sql片段的時候,例如 模糊查詢 selectuserbyname parametertype string resulttype user select from use...