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

新手上路,请多包涵

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

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

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

原文由 Gearoid Murphy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 765
2 个回答

CUDA 驱动程序 检查 内存范围是否被锁定,然后它将使用不同的代码路径。锁定的内存存储在物理内存 (RAM) 中,因此设备可以在没有 CPU 帮助的情况下获取它(DMA,也称为异步副本;设备只需要物理页面列表)。非锁定内存在访问时会产生页面错误,并且它不仅存储在内存中(例如它可以在交换中),因此驱动程序需要访问非锁定内存的每一页,将其复制到固定缓冲区并传递到 DMA(同步,逐页复制)。

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

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

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

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

原文由 osgx 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Shen Yang 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题