簡體   English   中英

CUDA和固定(頁面鎖定)內存根本沒有頁面鎖定?

[英]CUDA and pinned (page locked) memory not page locked at all?

當我需要固定(頁面鎖定)內存時,我試圖弄清楚CUDA(或OpenCL實現)是否說實話。

我嘗試了cudaMallocHost並查看了/proc/meminfoMlockedUnevictable ,兩者都保持在0並且從不上升( /proc/<pid>/status報告VmLck也為0)。 我使用mlock來鎖定內存,值按預期上升。

因此,這種行為的兩個可能原因可能是:

  1. 我沒有從CUDA API獲取頁面鎖定內存,而cudaSuccess是假的
  2. CUDA繞過用於頁面鎖定內存的OS計數器,因為CUDA對linux內核有一定的魔力

所以實際問題是:當我使用CUDA分配頁面鎖定內存時,為什么我不能從操作系統獲取頁面鎖定內存的值?

另外:如果沒有來自/proc/meminfo/proc/<pid>/status我在哪里可以獲得正確的值?

謝謝!

系統:Ubuntu 14.04.01 LTS; CUDA 6.5; Nvidida Driver 340.29; Nvidia Tesla K20c

似乎CUDA 6.5下的固定分配器正在使用帶有MAP_FIXED的mmap() 雖然我不是操作系統專家,但這顯然具有“固定”內存的作用,即確保其地址永遠不會改變。 然而,這不是一個完整的解釋。 請參閱@Jeff的答案,其中指出幾乎可以肯定的是“缺失的部分”。

讓我們考慮一個簡短的測試程序:

#include <stdio.h>
#define DSIZE (1048576*1024)

int main(){

  int *data;
  cudaFree(0);
  system("cat /proc/meminfo > out1.txt");
  printf("*$*before alloc\n");
  cudaHostAlloc(&data, DSIZE, cudaHostAllocDefault);
  printf("*$*after alloc\n");
  system("cat /proc/meminfo > out2.txt");
  cudaFreeHost(data);
  system("cat /proc/meminfo > out3.txt");
  return 0;
}

如果我們用strace運行這個程序,並摘錄printf語句之間的輸出部分,我們有:

write(1, "*$*before alloc\n", 16*$*before alloc)       = 16
mmap(0x204500000, 1073741824, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, 0, 0) = 0x204500000
ioctl(11, 0xc0304627, 0x7fffcf72cce0)   = 0
ioctl(3, 0xc0384657, 0x7fffcf72cd70)    = 0
write(1, "*$*after alloc\n", 15*$*after alloc)        = 15

(請注意,1073741824正好是一千兆字節,即與請求的1048576 * 1024相同)

回顧mmap描述 ,我們有:

address給出映射的首選起始地址。 NULL表示沒有首選項。 此地址上的任何先前映射都將自動刪除。 除非您使用MAP_FIXED標志,否則您提供的地址仍可能會更改。

因此,假設mmap命令成功,請求的虛擬地址將被修復,這可能是有用的,但不是整個故事。

正如我所提到的,我不是操作系統專家,對我而言,這個系統調用究竟是什么產生“固定”映射/分配並不明顯。 可能是MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS的組合以某種方式創建了固定的底層分配,但我沒有找到任何證據支持這一點。

基於這篇文章 ,似乎即使是mlock() ed頁面也不能滿足DMA活動的需要,這是CUDA中固定主機頁面的關鍵目標之一。 因此,似乎其他東西提供了實際的“固定”(即保證底層物理頁面總是駐留在內存中,並且它們的虛擬到物理映射不會改變 - 后者可能是由MAP_FIXED以及任何機制確保底層物理頁面不以任何方式移動完成。

這個機制顯然不使用mlock() ,因此mlock()的頁面在之前和之后都沒有變化。 但是我們期望映射統計信息發生變化,如果我們對上面程序產生的out1.txt和out2.txt進行區分,我們會看到(摘錄):

< Mapped:            87488 kB
---
> Mapped:          1135904 kB

差異大約是一千兆字節,即所請求的“固定”內存量。

頁面鎖定可能意味着不同的事情。 對於用戶空間應用程序,通常意味着將頁面保留在內存中以避免頁面錯誤:

“)已被鎖定到內存與像m鎖(調用一個頁面需要永遠是系統的RAM實際存在,在表面層次上,鎖定頁面應該這樣永遠當應用程序訪問導致頁面錯誤。 但是,沒有什么需要鎖定的頁面始終存在於同一個地方;如果需要,內核可以自由移動鎖定的頁面 。“ [1]

請注意,這些鎖定的頁面仍然可以移動,不適合I / O設備訪問。

相反,另一個頁面鎖定的概念稱為釘扎。 固定頁面保持相同的物理映射。 需要此功能的驅動程序通常直接執行此操作並繞過鎖定的頁面記帳。 cudaMallocHost幾乎肯定會使用cuda驅動程序以這種方式固定頁面。

更多信息見[1]。

[1] https://lwn.net/Articles/600502/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM