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