如何将 GPUDirect RDMA 与 Infiniband 结合使用
How to use GPUDirect RDMA with Infiniband
我有两台机器。每台机器上有多张特斯拉卡。每台机器上还有一个 InfiniBand 卡。我想通过 InfiniBand 在不同机器上的 GPU 卡之间进行通信。点对点单播就可以了。我当然想使用 GPUDirect RDMA,这样我就可以省去额外的复制操作。
我知道 Mellanox 现在提供 driver 的 InfiniBand 卡。但它没有提供详细的开发指南。我也知道 OpenMPI 支持我要求的功能。但是 OpenMPI 对于这个简单的任务来说太重了,它不支持单个进程中的多个 GPU。
不知道直接用驱动来通讯能不能帮上忙。代码示例、教程,任何东西都会很好。另外,如果有人能帮助我在 OpenMPI 中找到处理此问题的代码,我将不胜感激。
要使 GPUDirect RDMA 正常工作,您需要安装以下软件:
已安装 Mellanox OFED(来自 http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers)
最近安装的 NVIDIA CUDA 套件
- Mellanox-NVIDIA GPUDirect 插件(来自您在上面提供的 link - 以访客身份发帖阻止我发帖 links :( )
应安装以上所有内容(按上面列出的顺序),并加载相关模块。
之后,您应该能够为 RDMA 事务注册在 GPU 视频内存上分配的内存。示例代码如下所示:
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。
我有两台机器。每台机器上有多张特斯拉卡。每台机器上还有一个 InfiniBand 卡。我想通过 InfiniBand 在不同机器上的 GPU 卡之间进行通信。点对点单播就可以了。我当然想使用 GPUDirect RDMA,这样我就可以省去额外的复制操作。
我知道 Mellanox 现在提供 driver 的 InfiniBand 卡。但它没有提供详细的开发指南。我也知道 OpenMPI 支持我要求的功能。但是 OpenMPI 对于这个简单的任务来说太重了,它不支持单个进程中的多个 GPU。
不知道直接用驱动来通讯能不能帮上忙。代码示例、教程,任何东西都会很好。另外,如果有人能帮助我在 OpenMPI 中找到处理此问题的代码,我将不胜感激。
要使 GPUDirect RDMA 正常工作,您需要安装以下软件:
已安装 Mellanox OFED(来自 http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers)
最近安装的 NVIDIA CUDA 套件
- Mellanox-NVIDIA GPUDirect 插件(来自您在上面提供的 link - 以访客身份发帖阻止我发帖 links :( )
应安装以上所有内容(按上面列出的顺序),并加载相关模块。 之后,您应该能够为 RDMA 事务注册在 GPU 视频内存上分配的内存。示例代码如下所示:
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。