如何在 Infiniband 中使用 GPUDirect RDMA

Posted

技术标签:

【中文标题】如何在 Infiniband 中使用 GPUDirect RDMA【英文标题】:How to use GPUDirect RDMA with Infiniband 【发布时间】:2015-09-11 19:49:36 【问题描述】:

我有两台机器。每台机器上有多张特斯拉卡。每台机器上还有一张 InfiniBand 卡。我想通过 InfiniBand 在不同机器上的 GPU 卡之间进行通信。只需点对点单播就可以了。我当然想使用 GPUDirect RDMA,这样我就可以省去额外的复制操作。

我知道 Mellanox 现在为其 InfiniBand 卡提供了 driver。但它没有提供详细的开发指南。我也知道 OpenMPI 支持我要求的功能。但是 OpenMPI 对于这个简单的任务来说太重了,它不支持单个进程中的多个 GPU。

我想知道直接使用驱动程序进行通信是否可以得到任何帮助。代码示例,教程,任何东西都会很好。另外,如果有人能帮我在 OpenMPI 中找到处理这个问题的代码,我将不胜感激。

【问题讨论】:

这听起来像是你应该和 Mellanox 谈谈的事情 有问题的代码主要位于openib BTL 组件中。查找名称中包含 gdr 的内容,以及预处理器符号名称中包含 CUDAGRD 的条件编译块。 请注意,对场外资源(例如教程)的请求在此处被视为离题,使您的问题处于离题边缘。 【参考方案1】:

要使 GPUDirect RDMA 工作,您需要安装以下内容:

已安装 Mellanox OFED(来自 http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers)

最近安装了 NVIDIA CUDA 套件

Mellanox-NVIDIA GPUDirect 插件(来自您上面提供的链接 - 以访客身份发布会阻止我发布链接 :()

应安装以上所有内容(按上面列出的顺序),并加载相关模块。 之后,您应该能够注册在 GPU 视频内存上分配的内存用于 RDMA 事务。示例代码如下所示:

void * gpu_buffer;
struct ibv_mr *mr;
const int size = 64*1024;
cudaMalloc(&gpu_buffer,size); // TODO: Check errors
mr = ibv_reg_mr(pd,gpu_buffer,size,IBV_ACCESS_LOCAL_WRITE|IBV_ACCESS_REMOTE_WRITE|IBV_ACCESS_REMOTE_READ);

这将创建(在启用 GPUDirect RDMA 的系统上)一个内存区域,其中包含一个有效的内存密钥,您可以将其用于与我们的 HCA 进行 RDMA 事务。

有关在代码中使用 RDMA 和 InfiniBand 动词的更多详细信息,您可以参考此document。

【讨论】:

您能否使用 Mellanox 的 RDMA 从 GPU 读取/写入服务器的远程内存?

以上是关于如何在 Infiniband 中使用 GPUDirect RDMA的主要内容,如果未能解决你的问题,请参考以下文章

Infiniband

从零学习 InfiniBand-network架构—IB协议链路层QoS如何实现

基于Infiniband高性能集群硬件配置方案

Exadata中Infiniband交换机升级

InfiniBand:传输速率取决于 MPI_Test* 频率

[转帖]InfiniBand 主流厂商 和 产品分析