我有两个与CUDA 4.0 Peer访问相关的问题:
有什么方法可以复制像这样的数据GPU#0 ---> GPU#1 ---> GPU#2 ---> GPU#3.目前在我的代码中,当我一次只使用两个GPU时,它工作正常,但是当我使用第三个GPU检查对等访问时失败cudaDeviceCanAccessPeer.所以,以下工作 -
cudaDeviceCanAccessPeer(&flag_01, dev0, dev1)但是当我有两个这样的语句时:
cudaDeviceCanAccessPeer(&flag_01, dev0, dev1)和cudaDeviceCanAccessPeer(&flag_12, dev1, dev2),后来失败(0返回到flag_12变量).
它是否仅适用于通过公共PCIe连接的GPU,还是Peer副本取决于底层PCIe互连?我不懂PCIe,但在做nvidia-smi时,我发现GPU的PCIe总线是2,3,83和84.
测试平台是双插槽6核Intel Westmere,带有4个GPU - Nvidia Tesla C2050.
编辑:HtoD和DtoH之间的带宽测试,以及两个GPU(DtoD)之间的SimpleP2P结果:

我怀疑这是问题所在.来自即将发布的NVIDIA文档:
NVIDIA GPU旨在充分利用PCI-e Gen2标准,包括Peer-to-Peer通信,但IOH芯片组不支持与其他IOH芯片组进行P2P通信的完整PCI-e Gen2规范
如果应用程序尝试在需要通过QPI进行P2P通信的两个GPU之间建立P2P关系,则cudaPeerEnable()API调用将返回错误代码.P2P直接传输的cudaMemcopy()函数自动回退到使用设备到主机到设备的路径,但P2P直接访问没有自动回退(设备代码中的P2P加载/存储指令).
一个已知的示例系统是具有双IOH芯片组的HP Z800工作站,其可以运行simpleP2P示例,但由于回退路径,带宽非常低(100s of MB/s而不是几GB/s).
NVIDIA正在调查是否可以通过为未来的GPU架构添加功能来支持跨越QPI的GPU P2P.
参考:英特尔®5520芯片组和英特尔®5500芯片组数据表,表7-4:入站内存地址解码:"IOH不支持PCI Express的非连续字节启用,用于远程对等MMIO事务.这是对PCI Express标准要求的额外限制,以防止与英特尔QuickPath互连不兼容".- http://www.intel.com/Assets/PDF/datasheet/321328.pdf
总的来说,我们建议构建多GPU工作站和集群,这些工作站和集群具有用于连接到单个IOH的GPU的所有PCI-express插槽.