与非锁定内存相比,固定或页面锁定内存传输到 GPU 的速度更快。
CUDA 提供 cudaHostAlloc
和 cudaHostRegister
调用来分配或注册页面锁定内存。 Nvidia 驱动程序随后检查内存传输是否主机内存被锁定并根据复制代码路径发出。
是否可以使用系统调用mlock()
实现与cudaHostRegister
完全相同的效果(关于传输速度)来对内存进行页锁定?还是相应的 CUDA 调用会更新驱动程序查询的内部数据库?
最佳答案
我认为 NVIDIA 驱动程序维护其自己的页面锁定内存,可通过 cudaHostAlloc
等访问。系统调用 mlock
使用内核锁定,这在技术上等同于驱动程序确实如此,但是内核页面锁定非常资源受限RLIMIT_MEMLOCK
,这是非常小的。因此 NVIDIA 驱动程序使用它自己的页面锁定机制。他们警告过度使用,因为它会窃取内核其余部分可以访问的大量内存。
因此,cudaHostRegister
在页面锁定内存的意义上等同于 mlock()
,但在它受限于资源限制的意义上则不是。从某种意义上说,cudaMemcpy
是加速的。
关于c - cudaHostRegister 是否等同于 mlock() 系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10648849/