[英]CUDA and pinned (page locked) memory not page locked at all?
當我需要固定(頁面鎖定)內存時,我試圖弄清楚CUDA(或OpenCL實現)是否說實話。
我嘗試了cudaMallocHost
並查看了/proc/meminfo
值Mlocked
和Unevictable
,兩者都保持在0並且從不上升( /proc/<pid>/status
報告VmLck
也為0)。 我使用mlock
來鎖定內存,值按預期上升。
因此,這種行為的兩個可能原因可能是:
所以實際問題是:當我使用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]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.