我有:
cudaHostAlloc(..., cudaHostAllocMapped)
或cudaHostRegister(..., cudaHostRegisterMapped)
成功固定和映射的主机内存; cudaHostGetDevicePointer(...)
获取设备指针。我在src和dest设备指针上发起cudaMemcpy(..., cudaMemcpyDeviceToDevice)
,指向通过上述技术获得的固定+映射内存的两个不同区域。
一切正常。
问题:我应该继续这样做,还是只使用传统的CPU风格memcpy()
,因为一切都在系统内存中? ......或者它们是相同(即当{s}和dest被固定时,cudaMemcpy
是否映射到直memcpy
?
(我仍在使用cudaMemcpy
方法,因为以前所有内容都在设备全局内存中,但由于gmem大小限制而已经切换到固定内存)
答案 0 :(得分:3)
使用cudaMemcpy
,CUDA驱动程序检测到您正在从主机指针复制到主机指针,并且复制在CPU上完成。如果您愿意,您当然可以自己在CPU上使用memcpy。
如果您使用cudaMemcpy
,则在执行复制之前可能会执行额外的流同步(您可能会在分析器中看到,但我猜测有测试并看到)。
在一个UVA系统上,你可以使用cudaMemcpyDefault
作为talonmies在他的回答中说。但是如果你没有UVA(sm_20 +和64位操作系统),那么你必须调用正确的副本(例如cudaMemcpyDeviceToDevice
)。如果您cudaHostRegister()
感兴趣的所有内容,那么cudaMemcpyDeviceToDevice
将根据内存的位置最终执行以下操作:
答案 1 :(得分:2)
如果您正在使用UVA(统一虚拟寻址)的平台上工作,我强烈建议您将cudaMemcpy
与cudaMemcpyDefault
一起使用。这样,所有关于最快路径的手动变成了内部API实现细节,您不必担心。