【问题标题】:Using multiple CUDA GPUs使用多个 CUDA GPU
【发布时间】:2016-05-17 05:34:56
【问题描述】:

我正在使用 NVIDIA Grid K2 进行 CUDA 编程。它有两个 GPU,每个都有 1536 个内核。 是否可以在单个或多个内核调用中同时使用两个 GPU?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    不,这是不可能的。像 Grid K2 这样的多 GPU 卡上的每个 GPU 都是一个独立的 CUDA 设备,具有自己的内存。因此,每个 GPU 都有自己的 CUDA 上下文,并且必须显式编程。 CUDA 驱动程序或运行时不会自动将这两个设备用作内核启动的单个虚拟设备。

    【讨论】:

    • 内存至少是共享的吗? IE。我可以将数据从主机复制到 device0,然后在 device1 上运行将使用来自 device0 的数据的内核吗?还是我必须将数据分别复制到每一个?或者至少可以在设备之间直接复制数据(从dev0到dev1)?
    • @ValCool:据我所知,答案是否定的,内存不共享。在支持的平台上,可以使用统一的虚拟内存和点对点的内存访问,但是两个独立的 GPU 只通过板上的一个通用 PCI-e 桥接芯片链接,并且通信基本上以 PCI-e DMA 速度
    • 所以 SLI 不用于这种通信?
    • @ValCool:不。CUDA 与 SLI 无关。正如我向我解释的那样,SLI 链路基本上是一种带宽相对较低、延迟较低的链路,用于显示设备之间的帧缓冲同步。 Windows 上 SLI 模式 下双 GPU 卡的内存行为不同,因为驱动程序似乎使用相同的 PCI-e 级对等进程 CUDA 用于保持 Direct3D 或 OpenGL 上下文对象同步GPU 之间。但在这些抽象级别下,它们仍然是位于 PCI-e 交换机上的两个分立设备。
    • 我正在使用 Cudafy.NET 并且刚刚发现了一个将数据从一个 GPU 设备复制到另一个的函数:_gpu0.CopyDeviceToDevice(_gpuuintBufferIn0, 0, _gpu1, _gpuuintBufferIn1, 0 , _uintBufferIn0.Length); 你认为,它首先将数据复制到内部的主机内存,然后再移动它到其他设备?
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 2011-09-26
    • 2014-07-07
    • 2011-10-26
    • 1970-01-01
    • 2012-08-16
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多