我目前正在编写CUDA应用程序,并且遇到了一些“喂食野兽”的IO问题。
我想知道是否有任何方法可以直接从RAID Controller 或NIC读取数据,并将数据直接发送到GPU。我要完成的工作直接显示在以下演示文稿的幻灯片#3中:http://developer.download.nvidia.com/devzone/devcenter/cuda/docs/GPUDirect_Technology_Overview.pdf。
话虽如此,显然已经在这里回答了这个问题:Is it possible to access hard disk directly from gpu?,但是我所附的演示文稿相信我只需要在Linux中设置一个环境变量(但它没有提供任何有用的代码段/示例)。 。
因此,我想知道是否可以将数据从NIC/RAID Controller 直接读取到GPU中,这样做需要什么?我需要为硬件编写自己的驱动程序吗?有没有避免某些副本的示例?
在此先感谢您的帮助。
最佳答案
GPUDirect是一个技术“伞词”,通常是一个品牌,指的是能够以某种方式绕过主机内存进行不必要的访问的,直接往返于GPU的数据传输的技术。
GPUDirect v1是一种与特定的infiniband适配器一起使用的技术,可在GPU驱动程序和IB驱动程序之间共享数据缓冲区。该技术已被GPUDirect(v3)RDMA取代。此v1技术无法在任何NIC上通用使用。环境变量引用:
是指启用GPUDirect v1。它不是通用的NIC启动器。
GPUDirect v2也称为GPUDirect对等,它仅用于在同一PCIE结构上的两个CUDA GPU之间进行数据传输。它不支持与任何其他类型的设备的互操作性。
GPUDirect v3也称为GPUDirect RDMA。
如今,GPUDirect RDMA的规范用例是与Mellanox Infiniband(IB)适配器一起使用的。 (也可以在Mellanox的帮助下,使用Mellanox以太网适配器和RoCE使它工作)。如果这符合您对“NIC”的定义,则可以通过假设您具有适当的硬件来加载适当的软件堆栈来实现。 GPU和IB设备需要在同一PCIE架构上,这意味着它们需要连接到同一PCIE根联合体(有效地,连接到同一CPU插槽)。当与Mellanox IB适配器一起使用时,典型用法将涉及GPUDirect RDMA-aware MPI。
如果您有自己的未指定NIC或RAID Controller ,并且还没有GPUDirect RDMA linux设备驱动程序,则无法使用GPUDirect。 (如果有它的GPUDirect RDMA驱动程序,请与制造商或驱动程序提供商联系以寻求帮助。)如果您可以访问该驱动程序源代码,并且熟悉编写自己的linux设备驱动程序,则可以尝试制作自己的GPUDirect驱动程序。涉及的步骤超出了我的回答范围,但是起点是documented here。
是的,如果您还没有GPUDirect RDMA驱动程序,则需要编写一个驱动程序。
GPUDirect RDMA MPI link给出了示例,并说明了GPUDirect RDMA如何在将数据从GPU传输到IB适配器的过程中避免不必要的设备主机数据复制。通常,数据可以直接(通过PCIE)从GPU设备上的内存传输到IB设备上的内存(反之亦然),而不会通过主机内存跳闸(GPUDirect v1不能实现此目的)。
更新:NVIDIA最近宣布了一项名为GPU Direct Storage的新GPU Direct技术。