[英]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.