我有:
cudaHostAlloc(..., cudaHostAllocMapped)或成功固定和映射的主机内存cudaHostRegister(..., cudaHostRegisterMapped);cudaHostGetDevicePointer(...).我cudaMemcpy(..., cudaMemcpyDeviceToDevice)在src和dest设备指针上启动,指向通过上述技术获得的两个不同的固定+映射内存区域.一切正常.
问题:我应该继续这样做还是只使用传统的CPU风格,memcpy()因为一切都在系统内存中?...或者它们是否相同(即当src和dest固定时,是否cudaMemcpy映射到直线memcpy)?
(我仍在使用该cudaMemcpy方法,因为之前所有内容都在设备全局内存中,但由于gmem大小限制,因此已切换到固定内存)
CUDA 驱动程序检测cudaMemcpy到您正在从主机指针复制到主机指针,并且复制是在 CPU 上完成的。如果您愿意,当然可以自己在 CPU 上使用 memcpy。
如果您使用cudaMemcpy,则在进行复制之前可能会执行额外的流同步(您可能会在探查器中看到,但我猜在那里 - 测试并查看)。
在 UVA 系统上,您可以cudaMemcpyDefault按照 talonmies 在他的回答中所说的那样使用。但是如果你没有\xe2\x80\x99t有UVA(sm_20+和64位操作系统),那么你必须调用正确的副本(例如cudaMemcpyDeviceToDevice)。如果您cudaHostRegister()对所有感兴趣的内容都感兴趣,那么cudaMemcpyDeviceToDevice最终将根据内存所在的位置执行以下操作: