我有一个带有2个GTX 590卡(4个GPU)的Linux机箱。使用CUDA 4.0驱动程序,我可以调用GPUDirect内存访问并验证所有可能的4个GPU对之间的成功复制。
但是,在我升级到CUDA 4.1驱动程序(或任何后续驱动程序)之后,我在GPUDirect访问对中受到限制。
例如,在CUDA 4.0下的以下内容之间启用了点对点:
GPU0< - > GPU1
GPU0< - > GPU2
GPU0< - > GPU3
GPU1< - > GPU2
GPU1< - > GPU3
GPU2< - > GPU3
但根据CUDA 4.1(或更高版本),我仅限于访问:
GPU0< - > GPU1(同一张卡)
GPU2< - > GPU3(同一张卡)
GPU1< - > GPU3
使用最新的CUDA 5.x驱动程序时,有人可以解释这个或知道解决方法吗?
$ lspci -tv(有趣的部分)给出:
-[0000:00]-+-00.0 ATI Technologies Inc RD890 Northbridge only single slot PCI-e GFX Hydra part
+-02.0-[0c-0f]----00.0-[0d-0f]--+-00.0-[0f]--+-00.0 nVidia Corporation Device 1088
| | \-00.1 nVidia Corporation GF110 High Definition Audio Controller
| \-02.0-[0e]--+-00.0 nVidia Corporation Device 1088
| \-00.1 nVidia Corporation GF110 High Definition Audio Controller
:
+-0b.0-[04-07]----00.0-[05-07]--+-00.0-[07]--+-00.0 nVidia Corporation Device 1088
| | \-00.1 nVidia Corporation GF110 High Definition Audio Controller
| \-02.0-[06]--+-00.0 nVidia Corporation Device 1088
| \-00.1 nVidia Corporation GF110 High Definition Audio Controller
对我而言,看起来所有路径都是物理可用的(树状结构),并且它们在使用cuda 4.0时,但是当使用cuda 4.1及更高版本时,cudaDeviceCanAccessPeer()为“交叉卡”通信提供了错误。注意,所有主机到设备路径始终可用(当然)。
答案 0 :(得分:4)
启用CUDA对等访问由GPU驱动程序管理,GPU驱动程序检查系统配置以确定对等访问是否可能有效。
例如,当2个设备之间的直接通信必须通过QPI链路传输时,未启用对等访问,如here所述。
因此,GPU驱动程序检查系统配置,并根据系统拓扑是否可识别以及识别的拓扑是否适合某些启发式方法来确定是否启用对等访问,以确定是否支持对等将会成功。
在您的情况下,如果您可以在同一张卡上的设备之间进行通信,这仅仅意味着GPU驱动程序拓扑识别启发式指示当唯一的介入设备是卡上的PCIE交换机时,对等对等将成功并且所以它已启用(cudaDeviceCanAccessPeer
将返回true)。
在您的情况下,我会说如果您可以在同一张卡上的设备之间成功启用对等访问,但在其他任何情况下都没有,那么您的系统拓扑可能会陷入某种“无法识别”的情况,或者可能是黑名单场景。换句话说,这可能是预期的行为。
如果您可以在同一张卡上的设备之间启用对等访问,也可以在不同卡上的某些设备对之间启用对等访问,但不能在不同卡上启用其他设备对,这可能是机器配置问题或错误。
由驱动程序维护的管理启发式和白名单以及黑名单可能会从驱动程序版本更改为驱动程序版本,这解释了为什么当您从旧版本迁移到较新版本时,您会看到行为上的差异。 (是的,当你转向更新的版本时,启发式可能会变得更加严格。)
例如,可能的情况是,当启动式最初在CUDA 4.0附带的270.41.19驱动程序中定义时,RD890芯片组被认为是PCIE P2P的“安全”。后来,根据测试或客户报告,可能会发现RD890主板的某些版本存在某些P2P问题。因此,P2P可能因此在基于RD890的系统的驱动程序中被“关闭”。我不知道这对RD890来说是真实的,我只是举例说明可能发生的事情,以说明为什么启发式方法随着时间的推移会变得更加严格。
我提供上述内容并不是对您案例的完整解释,因为如果您可以在不同卡上的某些GPU之间启用P2P,而不能在不同卡上的其他GPU 之间启用那对我来说听起来像是出乎意料的行为。我描述的其余部分只是背景信息。
我的描述并不完全清楚,因为在第一种情况下,您指出:
GPU0< - > GPU1(同一张卡)
GPU2< - > GPU3(同一张卡)
GPU1< - > GPU3
是成功的道路。假设GPU1 <-> GPU3
表示“跨卡”通信,这对我来说似乎是出乎意料的行为。
后来,你表示:
但是当使用cuda 4.1及更高版本时,cudaDeviceCanAccessPeer()会为“跨卡”通信提供false。
如果这是真的,那么基于对驱动程序中启用启发式的修改,可能只是预期的行为。
请注意,通常,P2P支持可能因GPU或GPU系列而异。在一个GPU类型或GPU系列上运行P2P的能力并不一定表明它可以在另一种GPU类型或系列上运行,即使在同一系统/设置中也是如此。 GPU P2P支持的最终决定因素是通过cudaDeviceCanAccessPeer
查询运行时提供的工具。 P2P支持也可能因系统和其他因素而异。此处所做的任何陈述都不是任何特定设置中任何特定GPU支持P2P的保证。