CUDA程式設計GPU記憶體總結
CUDA記憶體主要包括:分頁記憶體、鎖頁記憶體、零拷貝記憶體、統一虛拟尋址、統一記憶體位址。
分頁記憶體:
簡介:使用cudaMalloc()申請的主機記憶體,即可分頁記憶體。
特點:可分頁記憶體傳輸資料到裝置時,首先需要配置設定固定記憶體,在傳遞到裝置端。對主機而言,分頁記憶體可提高主機性能。
鎖頁記憶體:
簡介:使用cudaMallocHost()申請鎖頁記憶體,需使用cudaFreeHost()釋放鎖頁記憶體。
特點:裝置可直接通路鎖頁記憶體,可提高傳輸性能。
零拷貝記憶體:
簡介:利用cudaHostAlloc()申請零拷貝記憶體,改函數的flags标志有四種:
- cudaHostAllocDefalt(等同于cudaMallocHost函數);
- cudaHostAllocPortable;
- cudaHostAllocWriteCombined;
- cudaHostAllocMappe(零拷貝記憶體)。
主機通路零拷貝記憶體,直接使用可以。
裝置通路零拷貝記憶體:利用cudaGetDevicePointer((void **)&DevicePtr, void *HostPtr, unsigned int flag)擷取裝置零拷貝主機記憶體對應的裝置指針,然後将裝置指針傳入kernel函數。裝置就可直接通路主機記憶體了。
适合以下情況使用:
- 裝置不足時,可利用主機記憶體;
- 可避免裝置和主機間的顯示傳輸;
- 可提高PCI-e傳輸速率。
特點:主機無法通路裝置記憶體,裝置無法通路主機記憶體,但主機和裝置均可通路零拷貝記憶體。
統一虛拟位址
簡介:利用cudaHostAlloc()擷取的零拷貝記憶體,在UVA(統一虛拟位址)之前,核函數使用的指針必須為經過cudaGetDevicePointer()獲得的裝置指針。而有了UVA之後,則省去了這一步,核函數直接使用主機指針。
統一記憶體位址
簡介:利用cudaMallocManaged()申請托管記憶體,“統一記憶體”建立了一個托管記憶體池,記憶體池中已配置設定的空間,可以用相同的記憶體位址(指針)在CPU和GPU上進行通路。
特點:完成主機與裝置資料的自動拷貝,消除重複指針。