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

mik*_*pcw 5 cuda memcpy

我有:

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

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

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

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

har*_*ism 3

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

\n\n

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

\n\n

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

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