【问题标题】:How to copy cudaArray between two GPUs directly?如何直接在两个 GPU 之间复制 cudaArray?
【发布时间】:2016-05-20 03:51:37
【问题描述】:

假设我在 GPU1 中有一个 cudaArray,在 GPU2 中有另一个 cudaArray。

使用 cudaMemcpyDeviceToDevice 标志调用 cudaMemcpyArrayToArray 实际上会导致通过查看分析器将 GPU1 cudaArray 复制到主机内存和将主机内存复制到 GPU2 cudaArray。

我尝试将 GPU1 cudaArray 复制到 GPU1 全局内存并调用 cudaMemcpyPeer 复制到 GPU2 全局内存,然后将其复制到 GPU2 cudaArray。这比通过主机内存要好,但仍然有很多冗余复制。

为什么没有 cudaMemcpyPeerArrayToArray?如何直接在两个 GPU 之间复制 cudaArray?

【问题讨论】:

    标签: memory-management cuda gpu


    【解决方案1】:

    有一个用于 CUDA 阵列的点对点 API。

    使用cudaMemcpy3DPeercudaMemcpy3DPeerAsync。这将使用您系统上可用的点对点选项中的最佳设备到设备传输路径。

    【讨论】:

    • 我之前浏览过这个API,但没有注意到cudaArray隐藏在结构中......非常感谢指针
    • 但是这条路径通常是直接的吗?还是它通过设备内存? (比如说,在 Maxwell GPU 中)
    • @einpoklum:我不明白你在问什么。在这种情况下,什么是“直接”,什么是“通过设备内存”?
    • 我的意思是,数组的内容是否必须写入设备内存中的某个位置,从那里实际发送到另一个 GPU,还是可以直接发送到 PCI 总线?
    • @einpoklum:还是不明白你在问什么。根据定义,这是设备到设备的内存传输。源数据位于一个 GPU 内存中,并将被复制到另一个。但无论如何,PCI 设备都不支持 CUDA 点对点传输(他们甚至不再制造这些了吗?)它需要 PCI-e v2.0 规范的功能
    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多