c++ - 如何使用 GPU-CUDA 代码中的 GPU-DMA 来复制数据?

标签 c++ cuda gpgpu dma

使用 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/

相关文章:

c++ - 具有取决于其他对象的参数的谷歌模拟类构造函数

c++ - NRVO 不应该保证本地命名变量和调用站点变量采用相同的地址吗?

c++ - Klocwork 提示无符号与零的比较总是正确的——为什么?

opengl - DirectX/Cuda/OpenGL 的总/纹理可访问内存

c++ - Cuda 7.5 和 Visual Studio 2013 : Some examples work, 但其他返回 cudaErrorDevicesUnavailable

tensorflow - 计算能力 3.0 卡可以运行 Tensorflow 1.8 tensorflow-gpu 运行时吗?

parallel-processing - 如何将传输数据与执行推力算法重叠?

c++ - MVC 4 将数据传递给部分 View - 格式

graph-theory - 基于 GPU 搜索图上两个节点之间的所有可能路径

opencl - 是否可以将异步回调/延续附加到 SYCL 内核?