【问题标题】:Can I use Quadro K4000 and K2000 for GPUDirect v2 Peer-to-peer (P2P) communictation?我可以使用 Quadro K4000 和 K2000 进行 GPUDirect v2 点对点 (P2P) 通信吗?
【发布时间】:2014-04-14 19:00:08
【问题描述】:

我用:

  • 单 CPU (Intel Core i7-4820K Ivy Bridge-E) 40 通道 PCIe 3.0 + 主板 MSI X79A-GD65 (8D)
  • WindowsServer 2012、MSVS 2012 + CUDA 5.5 并编译为 64 位应用程序
  • GPU 英伟达 Quadro K4000 和 K2000
  • TCC 模式(特斯拉计算集群)中的所有 Quadros
  • nVidia 视频驱动程序 332.50

simpleP2P 测试表明,所有 Quadro K4000 和 K4000 - 都支持点对点 (P2P),但点对点 (P2P) 访问 - Quadro K4000 (GPU0) Quadro K2000 (GPU1 ) : 没有。

我可以将 Quadro K4000 和 K2000 用于GPUDirect v2 Peer-to-peer (P2P) communication 吗?

[C:\ProgramData\NVIDIA Corporation\CUDA 示例\v5.5\0_Simple\simpleP2P../../bi n/win64/Release/simpleP2P.exe] - 开始...检查多个 GPU... 支持 CUDA 的设备数量:3

GPU0 = "Quadro K4000" 支持点对点 (P2P)

GPU1 = "Quadro K2000" 支持点对点 (P2P)

GPU2 = "GeForce GT 640" 不支持点对点 (P2P)

检查 GPU 是否支持对等内存访问...

从 Quadro K4000 (GPU0) -> Quadro K2000 (GPU1) 进行点对点 (P2P) 访问:否

从 Quadro K2000 (GPU1) -> Quadro K4000 (GPU0) 进行点对点 (P2P) 访问:否

C:\ProgramData\NVIDIA 需要两个或更多 SM 2.0 类 GPU 公司\CUDA Samples\v5.5\0_Simple\simpleP2P../../bin/win64/Release/simpleP2P.exe 跑步。支持 UVA 需要具有 SM 2.0 功能的 GPU。同行 到 GPU0 GPU1 之间的对等访问不可用,放弃测试。

TCC 模式下的 Quadros:

nvidia-smi.exe"
Tue Mar 11 12:43:05 2014
+------------------------------------------------------+
| NVIDIA-SMI 5.320.57   Driver Version: 320.57         |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K2000        TCC  | 0000:01:00.0     Off |                  N/A |
| 30%   30C    P8    N/A /  N/A |        6MB /  2047MB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GT 640     WDDM  | 0000:02:00.0     N/A |                  N/A |
| 40%   32C  N/A     N/A /  N/A |     2016MB /  2047MB |     N/A      Default |
+-------------------------------+----------------------+----------------------+
|   2  Quadro K4000        TCC  | 0000:03:00.0     Off |                  N/A |
| 30%   36C    P8    10W /  87W |        8MB /  3071MB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Compute processes:                                               GPU Memory |
|  GPU       PID  Process name                                     Usage      |
|=============================================================================|
|    1            Not Supported                                               |

在文档中说:https://developer.nvidia.com/gpudirect

GPUDirect 显着消除了不必要的系统内存副本 降低 CPU 开销,并减少延迟,从而显着 应用程序数据传输时间的性能改进 在 NVIDIA Tesla™ 和 Quadro™ 产品上运行。

那里有更详细的Quadros规格,但只有GPUDirect For Video,没有P2P:http://www.nvidia.com/content/PDF/line_card/6660-nv-prographicssolutions-linecard-july13-final-lr.pdf

关于PCIe总线:

nvidia-smi -q
GPU 0000:01:00.0
    Product Name                    : Quadro K2000
    PCI
        Bus                         : 0x01
        Device                      : 0x00
        Domain                      : 0x0000
        Device Id                   : 0x0FFE10DE
        Bus Id                      : 0000:01:00.0
        Sub System Id               : 0x094C10DE
        GPU Link Info
            PCIe Generation
                Max                 : 2
                Current             : 1
            Link Width
                Max                 : 16x
                Current             : 8x
    FB Memory Usage
        Total                       : 2047 MiB
        Used                        : 6 MiB
        Free                        : 2041 MiB
    BAR1 Memory Usage
        Total                       : 256 MiB
        Used                        : 2 MiB
        Free                        : 254 MiB
    Compute Mode                    : Default
...

GPU 0000:02:00.0
    Product Name                    : GeForce GT 640
    PCI
        Bus                         : 0x02
        Device                      : 0x00
        Domain                      : 0x0000
        Device Id                   : 0x0FC110DE
        Bus Id                      : 0000:02:00.0
        Sub System Id               : 0x8A921462
        GPU Link Info
            PCIe Generation
                Max                 : N/A
                Current             : N/A
            Link Width
                Max                 : N/A
                Current             : N/A

...

GPU 0000:03:00.0
    Product Name                    : Quadro K4000
    PCI
        Bus                         : 0x03
        Device                      : 0x00
        Domain                      : 0x0000
        Device Id                   : 0x11FA10DE
        Bus Id                      : 0000:03:00.0
        Sub System Id               : 0x097C10DE
        GPU Link Info
            PCIe Generation
                Max                 : 2
                Current             : 1
            Link Width
                Max                 : 16x
                Current             : 16x
    FB Memory Usage
        Total                       : 3071 MiB
        Used                        : 8 MiB
        Free                        : 3063 MiB
    BAR1 Memory Usage
        Total                       : 256 MiB
        Used                        : 2 MiB
        Free                        : 254 MiB
    Compute Mode                    : Default

我可以将 GPUDirect v2 P2P 与 Quadros 一起使用吗?如果可以,那么在哪一个? BAR1 的大小是否应该等于 GPU-RAM 的大小才能使用 P2P?

更新 11.03.2014 23:16

  1. 不能使用 P2P 直接传输 - 我使用 cudaMemcpy(gpu_ptr1, gpu_ptr0, cudaMemcpyDefault); 在 PCIe-gen2 8x 上以 3 GB/秒(理论上 4 GB/秒)成功传输了随机生成的数据,但功能正常通过主机复制 - 在 VisualProfiler Context1(DtoH) 和 Context2(HtoD) 中。
  2. 不能通过使用__global__ Kernel(char *dst, char *src, size_t size) { int idx = blockIdx.x * blockDim.x + threadIdx.x; dst[idx] = src[idx]; } 使用P2P 直接访问 - 使用函数cudaDeviceEnablePeerAccess() 时出现错误,使用cudaDeviceCanAccessPeer() 时出现0

【问题讨论】:

  • 可能取决于芯片组,您可能会遇到这种情况:stackoverflow.com/a/6935100/1938163。 CUDA 5.5 中没有提到这个问题,所以我不排除它
  • @David Kernin 是的 GPU0QPI/HTGPU1 未解决。但这里我使用只有一个 IOH 的单 CPU,GPU 之间没有 QPI 连接。

标签: cuda gpgpu nvidia


【解决方案1】:

我不知道这是否与您的问题有关,但请注意:

    GPU Link Info
        PCIe Generation
            Max                 : 2
            Current             : 1
        Link Width
            Max                 : 16x
            Current             : 8x

还有这个:

        PCIe Generation
            Max                 : 2
            Current             : 1
        Link Width
            Max                 : 16x
            Current             : 16x

也就是说,您的 PCIe 链接已从 2.0 (5 GT/s) 降级到 1.0 (2.5 GT/s) 并且在一张卡上从 16x 降到 8x... 这很可能是 GPU 直接的问题也一样,但肯定不是您想要的,为了从您的 PCIe 中榨取所有性能(在一张卡上,您获得理论值的 25%,在另一张卡上获得 50%)。

我发现卡放在主板上的顺序很重要;过热也可能导致公共汽车降级,或者灰尘......行星对齐太可能......

编辑:我不知道 TCC 是 GPU 直接工作所必需的,因此以下内容无效。

首先,我会尝试移除显卡,看看是否只使用两个 Quadro 卡就可以获得所有 PCIe 2.0/16x,以及在这种情况下 GPU direct 是否开始工作。

编辑:根据您的附加信息:“因为在主板上,显示器必须连接到第一个插槽中的卡(带有 16 个 PCIe 通道),所以我有:16x-GeForce、16x-Quadro K4000 和 8x- Quadro K2000"

幸运的是,这不是真的(或者至少,不是manual of your motherboad 中报告的内容):

因此,连接显示器的正确位置是插槽 PCI_E6,即 8x 插槽……祝你换卡好运。

恭喜您的问题如此精确 - 这很有帮助(注意 - 仍然不知道它是否能解决......请随时通知我们!)。

【讨论】:

  • @Robert Crovella 一个小小的说明:因为 P2P 只能在 TCC 模式下实现,但 TCC 模式不支持视频输出到监视器(据我所知),并且因为在主板上监视器必须是连接到第一个插槽中的卡(带有 16 个 PCIe 通道),然后我有:16x-GeForce、16x-Quadro K4000 和 8x-Quadro K2000。请注意,如果我尝试使用 DMA 控制器复制数据: cudaMemcpy(gpu1, gpu0, default);然后我成功地做到了这一点,我得到了 3 GB/秒的速度,这对应于 PCIe gen2 8x(理论上是 4GB/秒),即直接复制。我比较数组 gpu0[] 和 gpu1[] - 它们是相等的。
  • @Alex 我已经用你的更多信息改进了我的答案......在我的情况下,我真的有一个令人沮丧的经历,但主板太旧而且问题来自非 nvidia PCIe 卡。跨度>
  • 谢谢!是的,我在文档中写了同样的内容。我在 PCI_E1、PCI_E4 和 PCI_E6 中有卡。但是我现在已经尝试过,将显示器连接到 PCI_E6 - 什么都没有显示,并且只在 PCI_E1 中显示。
  • 有可能你必须在 bios 中挖掘并告诉 使用哪张卡(到 bios - 注意手册是在说 POST 阶段,这就是消息之前)- BIOS 手册将有助于... BIOS 版本?
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 2013-11-02
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多