使用 CUDA SDK 5.5 我可以用来复制数据:
- 来自主机:
cudaMemcpy();
如果内存固定则使用 GPU-DMA - 来自主机:
memcpy();
或cudaMemcpy();
如果内存未固定,则使用 CPU 内核 - 来自 gpu:
for() { dst[i] = src[i]; }
或memcpy();
使用 GPU 核心 - 来自 GPU:使用 GPU-DMA ???
如何在 GPU-CUDA 代码的内核函数中使用 GPU-DMA 来复制数据?
最佳答案
如果设备不支持计算能力 3.5,则您尝试执行的操作在设备端是不可能的。如果您有这样的卡片,请参阅编辑。
是的,您可以通过将在另一台设备上分配的设备指针传递给您的内核来从另一台设备访问 GPU RAM。然后执行运行时会将请求的数据提供到正确的 GPU 上。但是,这不是很有效,因为每次访问另一个设备的内存都会导致对等或设备-主机-设备的 memcopy 操作。
您可以做的是从主机代码中执行预取数据,并为内存复制操作 (cudaMemcpy_async
) 和内核执行使用不同的流。然而,这只有在你有一张像样的卡和一个单独的复制单元并且你必须进行显式锁定时才有效,因为在数据传输完成之前没有内置结构可以保存你的内核。
编辑:
如果您有计算能力 3.5 设备,您可以使用 cuda 设备运行时在设备代码中从一个设备到另一个设备进行 memcopy。请在此处查看动态并行性文档:http://docs.nvidia.com/cuda/pdf/cuda_dynamic_parallelism_programming_guide.pdf请注意,设备上的所有内存复制操作也是异步的。您将不得不再次靠自己保持数据的一致性。
关于c++ - 如何使用 GPU-CUDA 代码中的 GPU-DMA 来复制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19242711/