与未锁定的内存相比,固定或页面锁定的内存可以更快地传输到GPU。
CUDA提供cudaHostAlloc
和cudaHostRegister
调用来分配或注册页面锁定的内存。然后,Nvidia驱动程序会检查内存传输是否已锁定主机内存,并根据复制代码路径进行发布。
是否可以通过系统调用mlock()
来对内存进行页锁,从而达到与cudaHostRegister
完全相同的效果(关于传输速度)?还是相应的CUDA调用会更新驱动程序查询的内部数据库?
最佳答案
我认为NVIDIA驱动程序维护着自己的页面锁定内存,可通过cudaHostAlloc
等访问。系统调用mlock
使用内核锁定,该内核锁定在技术上与驱动程序的功能相同,但是内核页面锁定受资源限制,RLIMIT_MEMLOCK
非常小。因此,NVIDIA驱动程序使用其自己的页面锁定机制。他们警告过度使用,因为它会窃取内核其余部分可访问的大量内存。
因此,就页面锁定内存的意义而言,cudaHostRegister
等同于mlock()
,但就其绑定(bind)资源限制而言,它并不等同于cudaMemcpy
。从某种意义上说,ojit_code是加速的。