cuda - 运行多 GPU CUDA 示例时 P2P 内存访问失败 (simpleP2P)

标签 cuda nvidia p2p multi-gpu

我正在尝试解决运行 CUDA 示例中包含的 simpleP2P 示例程序时发现的错误。错误如下:

$ ./simpleP2P 
[./simpleP2P] - Starting...
Checking for multiple GPUs...
CUDA-capable device count: 2
> GPU0 = "     Tesla K20c" IS  capable of Peer-to-Peer (P2P)
> GPU1 = "     Tesla K20c" IS  capable of Peer-to-Peer (P2P)

Checking GPU(s) for support of peer to peer memory access...
> Peer-to-Peer (P2P) access from Tesla K20c (GPU0) -> Tesla K20c (GPU1) : No
> Peer-to-Peer (P2P) access from Tesla K20c (GPU1) -> Tesla K20c (GPU0) : No
Two or more GPUs with SM 2.0 or higher capability are required for ./simpleP2P.
Peer to Peer access is not available between GPU0 <-> GPU1, waiving test.

我使用的设备如下:

$ lspci | grep NVIDIA
03:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)
83:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)

有关从 nvidia-smi 获得的连接的其他信息:

$ nvidia-smi topo -m
    GPU0    GPU1    CPU Affinity
GPU0     X  SOC 0-5,12-17
GPU1    SOC  X  6-11,18-23

Legend:

  X   = Self
  SOC = Path traverses a socket-level link (e.g. QPI)
  PHB = Path traverses a PCIe host bridge
  PXB = Path traverses multiple PCIe internal switches
  PIX = Path traverses a PCIe internal switch

lspci 工具终于有更详细的输出。

03:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)
        Subsystem: NVIDIA Corporation Device 0982
        Flags: bus master, fast devsel, latency 0, IRQ 11
        Memory at f9000000 (32-bit, non-prefetchable)
        Memory at d0000000 (64-bit, prefetchable)
        Memory at ce000000 (64-bit, prefetchable)
        Capabilities: <access denied>
        Kernel driver in use: nvidia
        Kernel modules: nvidia_346, nouveau, nvidiafb
...
83:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)
        Subsystem: NVIDIA Corporation Device 0982
        Flags: bus master, fast devsel, latency 0, IRQ 11
        Memory at cc000000 (32-bit, non-prefetchable)
        Memory at b0000000 (64-bit, prefetchable)
        Memory at ae000000 (64-bit, prefetchable)
        Capabilities: <access denied>
        Kernel driver in use: nvidia
        Kernel modules: nvidia_346, nouveau, nvidiafb

你们中有人有一些信息可以帮助我排除故障或至少更好地了解问题出在哪里吗?像往常一样感谢您的阅读/帮助。 ——奥马尔

最佳答案

当 GPU 通过套接字级链路互连时(基于 Intel 的系统的 QPI):

GPU0     X  SOC 0-5,12-17
GPU1    SOC  X  6-11,18-23
        ^^^

那么这 2 个 GPU 之间就不可能进行 P2P 事务。

参与 P2P 的 GPU 有许多要求。其中之一是它们通常必须位于同一 PCIE 根联合体上。通过套接字级链路(例如 QPI)连接的 GPU 位于两个不同的“套接字”上,即 2 个不同的 CPU,因此它们属于两个不同的 PCIE 根联合体。

请注意,一般来说,P2P 支持可能因 GPU 或 GPU 系列而异。在一种 GPU 类型或 GPU 系列上运行 P2P 的能力并不一定表明它可以在另一种 GPU 类型或系列上运行,即使在相同的系统/设置中也是如此。 GPU P2P 支持的最终决定因素是提供的通过 cudaDeviceCanAccessPeer 查询运行时的工具。 P2P 支持也可能因系统和其他因素而异。这里所做的任何声明都不能保证在任何特定设置中对任何特定 GPU 的 P2P 支持。

关于cuda - 运行多 GPU CUDA 示例时 P2P 内存访问失败 (simpleP2P),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563326/

相关文章:

c - 在 CUDA 中使用常量

p2p - 通过文件名在 IPFS 中搜索文件?

java - 在简单的 JXTA 2.7 应用程序中获取异常

Cuda:查明指针是设备指针还是主机指针

cuda - `cublasCreate_v2’ 中对 ‘/tmp/tmpxft_0000120b_0000000-10_my_program” 的 undefined reference

c++ - 使用 CUDA/NVCC 传递给函数时动态结构成员损坏

cuda - 每 block 最大线程数与共享内存大小

cuda - GPU亲和性(GPU核心亲和性)