我有两台机器。每台机器上都有多张特斯拉卡。每台机器上都有一张InfiniBand卡。我想通过InfiniBand在不同机器上的GPU卡之间进行通信。只需点对点单播即可。我当然希望使用GPUDirect RDMA,这样我就可以省去额外的复制操作。
我知道Mellanox现在可以提供driver的InfiniBand卡。但它没有提供详细的开发指南。另外我知道OpenMPI支持我要求的功能。但OpenMPI对于这个简单的任务来说太重了,它不能在一个进程中支持多个GPU。
我想知道我是否可以直接使用驱动程序进行通信。代码示例,教程,任何事情都会很好。另外,如果有人能帮我找到OpenMPI中的代码,我将不胜感激。
答案 0 :(得分:6)
要使GPUDirect RDMA正常运行,您需要安装以下软件:
安装了Mellanox OFED(来自http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers)
最近安装了NVIDIA CUDA套件
应安装上述所有内容(按上面列出的顺序),并加载相关模块。 之后,您应该能够注册在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。