CUDA頁鎖定記憶體(Pinned Memory)

2021-09-28 18:25:56 字數 1937 閱讀 1197

對cuda架構而言,主機端的記憶體被分為兩種,一種是可分頁記憶體(pageable memroy)和頁鎖定記憶體(page-lock或 pinned)。可分頁記憶體是由作業系統api malloc()在主機上分配的,頁鎖定記憶體是由cuda函式cudahostalloc()在主機記憶體上分配的,頁鎖定記憶體的重要屬性是主機的作業系統將不會對這塊記憶體進行分頁和交換操作,確保該記憶體始終駐留在物理記憶體中。

gpu知道頁鎖定記憶體的實體地址,可以通過「直接記憶體訪問(direct memory access,dma)」技術直接在主機和gpu之間複製資料,速率更快。由於每個頁鎖定記憶體都需要分配物理記憶體,並且這些記憶體不能交換到磁碟上,所以頁鎖定記憶體比使用標準malloc()分配的可分頁記憶體更消耗記憶體空間。

頁鎖定記憶體的內配、操作和可分頁記憶體的對比:

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include "iostream"

#include using namespace std;

float cuda_host_alloc_test(int size, bool up)

//在裝置上分配記憶體空間

cudastatus = cudamalloc((void **)&dev_a, size * sizeof(*dev_a));

if (cudastatus != cudasuccess)

//計時開始

cudaeventrecord(start, 0);

for (int i = 0; i < 100; i++)

//從裝置到主機複製資料

cudastatus = cudamemcpy(a, dev_a, size * sizeof(*dev_a), cudamemcpydevicetohost);

if (cudastatus != cudasuccess)

}cudaeventrecord(stop, 0);

cudaeventsynchronize(stop);

cudaeventelapsedtime(&elapsedtime, start, stop);

cudafreehost(a);

cudafree(dev_a);

cudaeventdestroy(start);

cudaeventdestroy(stop);

return (float)elapsedtime / 1000; }

float cuda_host_malloc_test(int size, bool up)

//計時開始

cudaeventrecord(start, 0);

for (int i = 0; i < 100; i++)

//從裝置到主機複製資料

cudastatus = cudamemcpy(a, dev_a, size * sizeof(*dev_a), cudamemcpydevicetohost);

if (cudastatus != cudasuccess)

}cudaeventrecord(stop, 0);

cudaeventsynchronize(stop);

cudaeventelapsedtime(&elapsedtime, start, stop);

free(a);

cudafree(dev_a);

cudaeventdestroy(start);

cudaeventdestroy(stop);

return (float)elapsedtime / 1000;}

int main()

對比效果,頁鎖定記憶體的訪問時間約為可分頁記憶體的訪問時間的一半:

CUDA統一記憶體 零複製記憶體 鎖頁記憶體

cuda 6.0以後,出現了 統一記憶體,unified memory,其具有以下特性 1 其宣告有以下兩種方式 a 使用關鍵字managed,可選的和device,一起使用,比如 devicemanagedint ret 1000 b 使用函式cudamallocmanaged int ret c...

CUDA記憶體使用

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

CUDA記憶體簡介

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