更好还是相同:CPU memcpy()与设备cudaMemcpy()在CUDA中的固定映射内存上?

时间:2012-09-17 05:42:56

标签: cuda memcpy

我有:

  • 使用cudaHostAlloc(..., cudaHostAllocMapped)cudaHostRegister(..., cudaHostRegisterMapped)成功固定和映射的主机内存;
  • 已使用cudaHostGetDevicePointer(...)获取设备指针。

我在src和dest设备指针上发起cudaMemcpy(..., cudaMemcpyDeviceToDevice),指向通过上述技术获得的固定+映射内存的两个不同区域。 一切正常。

问题:我应该继续这样做,还是只使用传统的CPU风格memcpy(),因为一切都在系统内存中? ......或者它们是相同(即当{s}和dest被固定时,cudaMemcpy是否映射到直memcpy

(我仍在使用cudaMemcpy方法,因为以前所有内容都在设备全局内存中,但由于gmem大小限制而已经切换到固定内存)

2 个答案:

答案 0 :(得分:3)

使用cudaMemcpy,CUDA驱动程序检测到您正在从主机指针复制到主机指针,并且复制在CPU上完成。如果您愿意,您当然可以自己在CPU上使用memcpy。

如果您使用cudaMemcpy,则在执行复制之前可能会执行额外的流同步(您可能会在分析器中看到,但我猜测有测试并看到)。

在一个UVA系统上,你可以使用cudaMemcpyDefault作为talonmies在他的回答中说。但是如果你没有UVA(sm_20 +和64位操作系统),那么你必须调用正确的副本(例如cudaMemcpyDeviceToDevice)。如果您cudaHostRegister()感兴趣的所有内容,那么cudaMemcpyDeviceToDevice将根据内存的位置最终执行以下操作:

  • 主机< - >主机:由CPU执行(memcpy)
  • 主机< - >设备:DMA(设备复制引擎)
  • 设备< - >设备:Memcpy CUDA内核(在SM上运行,由驱动程序启动)

答案 1 :(得分:2)

如果您正在使用UVA(统一虚拟寻址)的平台上工作,我强烈建议您将cudaMemcpycudaMemcpyDefault一起使用。这样,所有关于最快路径的手动变成了内部API实现细节,您不必担心。