为什么CUDA固定内存如此之快?
当我使用固定内存进行CUDA数据传输时,我观察到数据传输速度大幅提升。 在linux上,实现这个的底层系统调用是mlock。 从mlock的手册页,它指出,locking页面防止被换出:
mlock()locking从addr开始的地址范围内的页面并继续len字节。 当呼叫成功返回时,包含指定地址范围一部分的所有页面保证驻留在RAM中;
在我的testing中,我的系统上有几个空闲的内存,所以从来没有任何内存页可能被换掉的风险,但我仍然观察到加速。 任何人都可以解释这里发生了什么?任何洞察力或信息非常感谢。
CUDA驱动程序检查内存范围是否被locking,然后它将使用不同的代码path。 locking的内存被存储在物理内存(RAM)中,所以设备可以在没有来自CPU的帮助(DMA,也就是Async copy;设备只需要物理页面列表)的情况下获取它。 非locking内存可以在访问时产生页面错误,并且不仅存储在内存中(例如可以交换),所以驱动程序需要访问非locking内存的每个页面,将其复制到固定缓冲区并传递给它到DMA(同步,逐页复制)。
如此处所述http://forums.nvidia.com/index.php?showtopic=164661
asynchronousmem拷贝调用使用的主机内存需要通过cudaMallocHost或cudaHostAlloc进行页面locking。
我也可以推荐在developer.download.nvidia.com上检查cudaMemcpyAsync和cudaHostAlloc手册。 HostAlloc说cuda驱动程序可以检测固定的内存:
驱动程序跟踪使用此(cudaHostAlloc)函数分配的虚拟内存范围,并自动加速对函数(如cudaMemcpy())的调用。
如果内存页面还没有被访问,他们可能从来没有换入开始 。 特别地,新分配的页面将是通用“零页”的虚拟副本,并且在写入之前没有物理实例化。 磁盘上的新文件地图也将纯粹保留在磁盘上,直到读取或写入。
CUDA使用DMA将固定内存传输到GPU。 可分页主机内存不能与DMA一起使用,因为它们可能驻留在磁盘上。 如果内存没有固定(即页面locking),则首先将其复制到页面locking的“分段”缓冲区,然后通过DMA复制到GPU。 因此,使用固定内存可节省从可分页主机内存复制到页面locking主机内存的时间。