天天看點

CUDA程式設計GPU記憶體總結

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上進行通路。

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

繼續閱讀