当我使用固定内存进行 CUDA 数据传输时,我观察到数据传输的显着加速。在 linux 上,实现这一点的底层系统调用是 mlock。从 mlock 的手册页中,它指出锁定页面可以防止它被换出:
mlock() 锁定地址范围内的页面,从 addr 开始并持续 len 个字节。调用成功返回时,保证所有包含指定地址范围的一部分的页面都驻留在 RAM 中;
在我的测试中,我的系统上有几场空闲内存,因此内存页面没有被换出的风险,但我仍然观察到加速。谁能解释这里到底发生了什么?,任何见解或信息都非常感谢。
原文由 Gearoid Murphy 发布,翻译遵循 CC BY-SA 4.0 许可协议
CUDA 驱动程序 检查 内存范围是否被锁定,然后它将使用不同的代码路径。锁定的内存存储在物理内存 (RAM) 中,因此设备可以在没有 CPU 帮助的情况下获取它(DMA,也称为异步副本;设备只需要物理页面列表)。非锁定内存在访问时会产生页面错误,并且它不仅存储在内存中(例如它可以在交换中),因此驱动程序需要访问非锁定内存的每一页,将其复制到固定缓冲区并传递到 DMA(同步,逐页复制)。
如此处所述 http://forums.nvidia.com/index.php?showtopic=164661
我还可以建议在 developer.download.nvidia.com 上查看 cudaMemcpyAsync 和 cudaHostAlloc 手册。 HostAlloc 说 cuda 驱动程序可以检测到固定内存: