当我使用固定内存进行CUDA数据传输时,我观察到数据传输的大幅加速。在linux上,实现此目标的底层系统调用是mlock。从mlock的手册页中,它声明锁定页面可以防止它被换出:
mlock()锁定从addr开始的地址范围内的页面,并继续len字节。当调用成功返回时,包含指定地址范围一部分的所有页面都保证驻留在RAM中;
在我的测试中,我的系统上有一些可用内存,所以从来没有任何风险可以将内存页面换掉,但我仍然观察到加速。谁能解释一下这里到底发生了什么?,非常感谢任何见解或信息。
答案 0 :(得分:71)
CUDA驱动程序检查,如果内存范围被锁定,则它将使用不同的代码路径。锁定的存储器存储在物理存储器(RAM)中,因此设备可以从CPU(DMA,也称为异步复制;设备仅需要物理页面列表)的帮助中获取它。非锁定内存可以在访问时生成页面错误,并且它不仅存储在内存中(例如,它可以在交换中),因此驱动程序需要访问非锁定内存的每一页,将其复制到固定缓冲区并传递它到DMA(Syncronious,逐页复制)。
如此处所述http://forums.nvidia.com/index.php?showtopic=164661
异步内存复制调用使用的主机内存需要通过cudaMallocHost或cudaHostAlloc进行页面锁定。
我还建议您在developer.download.nvidia.com上查看cudaMemcpyAsync和cudaHostAlloc手册。 HostAlloc说cuda驱动程序可以检测固定内存:
驱动程序跟踪使用此(cudaHostAlloc)函数分配的虚拟内存范围,并自动加速对cudaMemcpy()等函数的调用。
答案 1 :(得分:8)
CUDA使用DMA将固定内存传输到GPU。可分页主机内存不能与DMA一起使用,因为它们可能驻留在磁盘上。 如果内存未固定(即页锁定),则首先将其复制到页面锁定的“暂存”缓冲区,然后通过DMA复制到GPU。 因此,使用固定内存可以节省从可分页主机内存复制到页面锁定主机内存的时间。
答案 2 :(得分:5)
如果尚未访问内存页面,则可能从未交换过。特别是,新分配的页面将是通用“零页面”的虚拟副本,并且在写入之前没有物理实例化。在读取或写入磁盘之前,磁盘上的新文件映射将同样保留在磁盘上。