何时使用cudaHostRegister()和cudaHostAlloc()?"固定或页面锁定"内存的含义是什么?哪些在OpenCL中是等效的?

Leo*_*313 6 memory-management cuda opencl

我对Nvidia的这个API很新,有些表达对我来说不太清楚.我想知道是否有人可以帮我理解何时以及如何以简单的方式使用这些CUDA命令.更确切地说:

研究如何通过并行执行内核(例如使用CUDA)来加速某些应用程序,在某些时候我遇到了加速主机 - 设备交互的问题.我有一些信息,在网上冲浪,但我有点困惑.很明显,当可以使用cudaHostRegister()和/或时,你可以更快cudaHostAlloc().在这里解释说

"您可以使用该cudaHostRegister()命令获取一些数据(已经分配)并将其固定,以避免额外的副本进入GPU".

"记住内存"是什么意思?为什么这么快?我以前如何在这个领域做到这一点?之后,在链接的同一视频中,他们继续解释这一点

"如果你正在传输PINNED内存,你可以使用异步内存传输cudaMemcpyAsync(),这让CPU在内存传输过程中继续工作".

PCIe事务是否完全由CPU管理?是否有公交车经理负责这件事?也非常感谢部分答案在最后重新组合拼图.

在OpenCL中有一些关于等效API的链接也很感激.

tal*_*ies 6

"记住内存"是什么意思?

这意味着锁定内存页面.这告诉操作系统虚拟内存管理器内存页必须保留在物理内存中,以便GPU可以通过PCI-express总线直接访问它们.

为什么这么快? 

简而言之,DMA.当内存被页面锁定时,GPU DMA引擎可以直接运行传输而无需主机CPU,这可以减少总体延迟并减少净传输时间.

PCIe事务是否完全由CPU管理?

不,见上文.

是否有公交车经理负责这件事?

不,GPU管理传输.在这种情况下,没有总线主人这样的东西


Ksh*_*ani 5

编辑:似乎 CUDA 将固定和页面锁定视为与Mark Harris 撰写的博客中的固定主机内存部分相同。这意味着答案没有实际意义,最佳答案应按原样采用。

我在寻找其他东西时遇到了这个问题。对于所有未来的用户,我认为 @talonmies 完美地回答了这个问题,但我想注意锁定页面和固定页面之间的细微差别 - 前者确保内存不可分页,但内核可以自由移动它后者确保它保留在内存中(即不可分页),但也映射到相同的地址。这是对相同内容的引用。