为什么CUDA固定内存这么快?

问题描述 投票:0回答:5

当我使用固定内存进行 CUDA 数据传输时,我观察到数据传输速度显着加快。在linux上,实现这一点的底层系统调用是mlock。从 mlock 的手册页来看,它指出锁定页面可以防止其被换出:

mlock() 锁定从 addr 开始并持续 len 字节的地址范围内的页面。 当调用成功返回时,所有包含指定地址范围一部分的页面都保证驻留在 RAM 中;

在我的测试中,我的系统上有几GB可用内存,因此不存在内存页面被交换的风险,但我仍然观察到加速。谁能解释一下这里到底发生了什么?非常感谢任何见解或信息。

c++ c linux cuda
5个回答
108
投票

CUDA 驱动程序检查,如果内存范围已锁定,则它将使用不同的代码路径。锁定内存存储在物理内存 (RAM) 中,因此设备无需 CPU 的帮助即可获取它(DMA,又名异步复制;设备只需要物理页列表)。未锁定的内存在访问时可能会产生页面错误,并且它不仅存储在内存中(例如,它可以在交换中),因此驱动程序需要访问非锁定内存的每个页面,将其复制到固定缓冲区中并传递它到 DMA(同步、逐页复制)。

如此处所述 http://forums.nvidia.com/index.php?showtopic=164661

异步mem复制调用使用的主机内存需要通过cudaMallocHost或cudaHostAlloc进行页面锁定。

我还建议您在developer.download.nvidia.com 上查看 cudaMemcpyAsync 和 cudaHostAlloc 手册。 HostAlloc 说 cuda 驱动程序可以检测固定内存:

驱动程序跟踪使用此(cudaHostAlloc)函数分配的虚拟内存范围,并自动加速对cudaMemcpy()等函数的调用。


26
投票

CUDA 使用 DMA 将固定内存传输到 GPU。可分页主机内存不能与 DMA 一起使用,因为它们可能驻留在磁盘上。 如果内存未固定(即页面锁定),则首先将其复制到页面锁定的“暂存”缓冲区,然后通过 DMA 复制到 GPU。 因此,使用固定内存可以节省从可分页主机内存复制到页锁定主机内存的时间。


5
投票

如果内存页面尚未被访问,它们可能“从一开始就从未被交换过”。特别是,新分配的页面将是通用“零页面”的虚拟副本,并且在写入之前没有物理实例化。磁盘上文件的新映射同样将纯粹保留在磁盘上,直到它们被读取或写入。


0
投票

如果 CPU RAM 有限的繁忙系统上的操作系统交换非锁定页面,其成本可能会非常高。然后将触发页面错误,通过昂贵的磁盘 IO 操作将页面加载到 CPU RAM 中。

在 CPU RAM 非常宝贵的系统上,固定页面还会导致虚拟内存抖动。如果发生抖动,CPU 的吞吐量可能会大大降低。

我想我需要一个支持固定内存的 GPU。如果不是这样,我怎样才能用正常的内存获得更好的性能?


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.