求助:如何在Azure两台CentOS A8 VM上运行Intel MPI RDMA应用
解决CentOS上Intel MPI RDMA pingpong测试程序缺失的问题
我帮你搞定这个CentOS上Intel MPI RDMA测试的问题,尤其是你提到的pingpong工具缺失的情况,一步步来:
1. 先确认Intel MPI的安装完整性
首先检查你的Intel MPI是不是没装全测试组件。如果是通过包管理器装的,试试安装intel-mpi-tests这类配套包(CentOS官方源或者Intel的repo里应该有)。要是你手动下载的Intel MPI安装包,安装时得确保勾选了「测试工具」的选项。
你可以用这条命令先确认MPI的基本状态:
mpiexec --version
然后去默认安装路径(一般是/opt/intel/mpi/<你的版本号>/)里找找bin或者test目录,看看有没有pingpong、pingping这些现成的测试工具。
2. 手动编译一个pingpong测试程序
要是确实找不到自带的工具,咱们自己写个极简的RDMA pingpong程序就行,用MPI标准API就能实现。把下面的代码保存成pingpong.c:
#include <mpi.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int rank, size; char message[100]; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (size != 2) { if (rank == 0) printf("这个测试需要正好2个进程!\n"); MPI_Finalize(); return 1; } if (rank == 0) { sprintf(message, "来自rank 0的问候"); MPI_Send(message, 100, MPI_CHAR, 1, 0, MPI_COMM_WORLD); MPI_Recv(message, 100, MPI_CHAR, 1, 0, MPI_COMM_WORLD, &status); printf("Rank 0收到:%s\n", message); } else { MPI_Recv(message, 100, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &status); printf("Rank 1收到:%s\n", message); sprintf(message, "来自rank 1的问候"); MPI_Send(message, 100, MPI_CHAR, 0, 0, MPI_COMM_WORLD); } MPI_Finalize(); return 0; }
然后用Intel MPI的编译器编译:
mpiicc pingpong.c -o pingpong
这样就得到可执行的pingpong程序了。
3. 配置RDMA环境并运行测试
跑测试前,先把RDMA环境确认好:
- 用
ibv_devinfo命令检查两台VM的RDMA设备状态(如果没装这个工具,先执行yum install rdma-core安装),确保10.1.1.0/24网段的接口已经启用RDMA。 - 运行测试时,指定Intel MPI用RDMA传输机制,比如:
mpiexec -hosts VM1,VM2 -env I_MPI_FABRICS=shm:dapl -env I_MPI_DAPL_PROVIDER=ofa-v2-ib0 ./pingpong
注意I_MPI_DAPL_PROVIDER的值要根据你的RDMA设备调整,比如如果是mlx4_0网卡,可能要改成ofa-v2-mlx4_0。
另外别忘了检查Azure的NSG规则,确保两台VM之间的RDMA流量是允许的(A8实例默认是开放的,但最好确认一下)。
4. 其他RDMA连通性验证方法
要是pingpong还是有问题,先用ibping测试底层RDMA硬件连通性:
- 在VM2上启动服务端:
ibping -s - 在VM1上发起测试:
ibping -c 4 <VM2的RDMA接口IP>
这个工具直接测试RDMA硬件层的连通性,能帮你快速排除底层网络问题。
内容的提问来源于stack exchange,提问作者Farhana Sarker




