我一直在这里https://developer.nvidia.com/gpudirect阅读有关 GPUDirect 的信息,在此示例中,有一个网卡连接到 PCIe 以及两个 GPU 和一个 CPU。
如何在尝试访问网络设备的所有客户端之间实施隔离?他们都访问设备的同一个 PCI BAR 吗?
网络设备是否使用某种 SR-IOV 机制来强制隔离?
我相信您说的是rDMA,它在 GPU Direct 的第二个版本中得到了支持。它是 NIC 卡可以在主机外部发送/接收数据的地方,并利用对等 DMA 传输与 GPU 的内存进行交互。
nVidia 将各种函数导出到内核空间,允许程序员自行查找物理页面在 GPU 上的位置,并手动映射它们。nVidia 还需要在内核空间内使用物理寻址,这极大地简化了其他 [3rd 方] 驱动程序如何通过主机的物理地址空间与 GPU 交互。
“从 PCI 设备的角度来看,GPUDirect 的 RDMA 目前依赖于所有物理地址相同。 ”
-nVidia,rDMA 和 GPUDirect 的设计注意事项
由于 nVidia 需要物理寻址方案,因此必须在系统中禁用所有 IOMMU,因为这会改变每张卡查看其他卡的内存空间的方式。目前,nVidia仅支持内核空间中 rDMA+GPUDirect 的物理寻址。虚拟寻址可以通过他们的 UVA,提供给用户空间。
如何在尝试访问网络设备的所有客户端之间实施隔离?他们都访问设备的同一个 PCI BAR 吗?
是的。在内核空间中,每个 GPU 的内存都通过其物理地址进行访问。
网络设备是否使用某种 SR-IOV 机制来强制隔离?
网卡的驱动程序是设置描述符列表和管理对资源的并发访问的所有工作——在这种情况下,这将是 GPU 的内存。正如我上面提到的,nVidia 让驱动程序开发人员能够管理 GPU 上的物理内存映射,允许第 3 方的 NIC 驱动程序控制哪些资源对远程机器可用或不可用。
根据我对 NIC 驱动程序的了解,我相信这是对 rDMA 和 GPUDirect 的幕后情况的一个非常粗略的概述:
所有通过 rDMA 请求数据的远程机器都将使用该主机的物理寻址方案来操作内存。例如,如果两台独立的计算机希望从支持 rDMA+GPUDirect 的第三台计算机的 GPU 读取相同的缓冲区,则人们会期望传入的读取请求的偏移量相同。写作也是如此。但是,如果将多个 DMA 引擎设置为在重叠区域中操作数据,则会引入一个额外的问题。此并发问题应由第 3 方 NIC 驱动程序处理。
在一个非常相关的说明中,我的另一篇文章有很多关于 nVidia 的 UVA(统一虚拟寻址)方案以及如何处理内核空间内的内存操作本身的信息。这篇文章中的一些句子是从中获取的。
对您的问题的简短回答:如果“隔离”是指每张卡如何为 rDMA+GPUDirect 操作保留自己的唯一地址空间,这是通过依赖主机的物理地址空间来完成的,该空间从根本上分离了物理地址空间( s) PCI 总线上所有设备的请求。通过强制使用每台主机的物理寻址方案,nVidia 基本上隔离了该主机中的每个 GPU。