NvLink 或 PCIe,如何指定互连?
NvLink or PCIe, how to specify the interconnect?
我的集群配备了 Nvlink 和 PCIe。所有 GPU(V100) 都可以通过 PCIe 或 NvLink 直接通信。据我所知,PCIe switch 和 Nvlink 都可以通过使用 CUDA 来支持直接 link。
现在,我想比较一下PCIe和NvLink的点对点通信性能。但是,我不知道如何指定一个,CUDA 似乎总是会自动指定一个。谁能帮帮我?
如果 CUDA 中的两个 GPU 之间有直接的 NVLink 连接,并且您启用了点对点传输,这些传输将通过 NVLink 传输。 CUDA 中没有任何方法可以改变这种行为。
如果您不启用点对点传输,那么这两个设备之间的数据传输(例如 cudaMemcpy
、cudaMemcpyAsync
、cudaMemcpyPeerAsync
)将从源 GPU 流出通过 PCIE 到 CPU 套接字,(可能遍历中间 PCIE 开关,也许还流过套接字级别 link,例如 QPI),然后通过 PCIE 从 CPU 套接字到另一个显卡。至少一个 CPU 套接字将始终涉及,即使在 PCIE 结构中存在更短的直接路径。此行为也无法以程序员可用的任何方式进行修改。
这两种方法都使用 p2pBandwidthLatencyTest
CUDA 示例代码进行了演示。
我的集群配备了 Nvlink 和 PCIe。所有 GPU(V100) 都可以通过 PCIe 或 NvLink 直接通信。据我所知,PCIe switch 和 Nvlink 都可以通过使用 CUDA 来支持直接 link。
现在,我想比较一下PCIe和NvLink的点对点通信性能。但是,我不知道如何指定一个,CUDA 似乎总是会自动指定一个。谁能帮帮我?
如果 CUDA 中的两个 GPU 之间有直接的 NVLink 连接,并且您启用了点对点传输,这些传输将通过 NVLink 传输。 CUDA 中没有任何方法可以改变这种行为。
如果您不启用点对点传输,那么这两个设备之间的数据传输(例如 cudaMemcpy
、cudaMemcpyAsync
、cudaMemcpyPeerAsync
)将从源 GPU 流出通过 PCIE 到 CPU 套接字,(可能遍历中间 PCIE 开关,也许还流过套接字级别 link,例如 QPI),然后通过 PCIE 从 CPU 套接字到另一个显卡。至少一个 CPU 套接字将始终涉及,即使在 PCIE 结构中存在更短的直接路径。此行为也无法以程序员可用的任何方式进行修改。
这两种方法都使用 p2pBandwidthLatencyTest
CUDA 示例代码进行了演示。