两台Windows 11设备搭建MS-MPI跨机通信遇异常求助
Windows 11下MS-MPI跨机通信问题排查与解答
环境详情
- 操作系统:两台设备均为Windows 11
- 用户凭据:两台笔记本使用相同用户名和密码,且均拥有管理员权限
- 网络:两台设备连接同一WiFi,处于同一局域网(可互相ping通)
- 计算机A:IP 192.168.1.128,计算机名称:LAPTOP-TCEUD71B
- 计算机B:IP 192.168.1.129,计算机名称:LAPTOP-X2APOPUU
- 防火墙:两台设备均已关闭防火墙
- MS-MPI版本:两台设备均安装了MS-MPI v10.1.3(包含msmpisdk.msi和msmpisetup.exe),默认安装路径为:
- C:\Program Files (x86)\Microsoft SDKs\MPI
- C:\Program Files\Microsoft MPI
- 测试程序位置:C:\code\TestMPI.exe
测试程序1:简单打印测试
#include <iostream> #include <cstdio> #include <mpi.h> int main() { MPI_Init(NULL, NULL); int WorldSize; MPI_Comm_size(MPI_COMM_WORLD, &WorldSize); int WorldRank; MPI_Comm_rank(MPI_COMM_WORLD, &WorldRank); char ProcessorName[MPI_MAX_PROCESSOR_NAME]; int NameLen; MPI_Get_processor_name(ProcessorName, &NameLen); printf("hello world from processor [%s], [%d/%d]\n", ProcessorName, WorldRank, WorldSize); MPI_Finalize(); return 0; }
测试程序2:数据交换测试
#include <iostream> #include <cstdio> #include <mpi.h> int main() { MPI_Init(NULL, NULL); int WorldSize; MPI_Comm_size(MPI_COMM_WORLD, &WorldSize); int WorldRank; MPI_Comm_rank(MPI_COMM_WORLD, &WorldRank); char ProcessorName[MPI_MAX_PROCESSOR_NAME]; int NameLen; MPI_Get_processor_name(ProcessorName, &NameLen); printf("processor [%s], [%d/%d]\n", ProcessorName, WorldRank, WorldSize); int SendData = 0, ReceiveData = 0; if (WorldRank == 0) { SendData = 666; MPI_Send(&SendData, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); MPI_Recv(&ReceiveData, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("node0[%s] send [%d], receive [%d]\n", ProcessorName, SendData, ReceiveData); } else if (WorldRank == 1) { SendData = 1234; MPI_Recv(&ReceiveData, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Send(&SendData, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); printf("node1[%s] send [%d], receive [%d]\n", ProcessorName, SendData, ReceiveData); } MPI_Finalize(); return 0; }
操作步骤
- 在每台设备上以管理员身份运行CMD,执行:
smpd -debug
- 在计算机A上打开新的CMD窗口,执行:
mpiexec -hosts 2 192.168.1.128 192.168.1.129 c:\code\TestMPI.exe
测试结果
- 测试程序1:仅计算机A输出内容,计算机B无输出,输出内容如下:
hello world from processor [LAPTOP-TCEUD71B], [0/2] hello world from processor [LAPTOP-X2APOPUU], [1/2]
- 测试程序2:程序挂起,两台设备均无任何输出
问题解答
1. 为何测试程序1仅计算机A产生输出?
这是MS-MPI的默认行为:跨机执行时,所有进程的标准输出会默认重定向到发起mpiexec的节点(即计算机A)的控制台,所以计算机B本身不会显示输出,但你已经在A上看到了B的进程输出(第二行来自LAPTOP-X2APOPUU),说明程序在B上已正常运行。
2. 为何测试程序2会导致程序挂起且无输出?
核心原因是启动命令格式错误:-hosts参数的正确格式是-hosts <节点数> <节点1名称/IP> <该节点进程数> <节点2名称/IP> <该节点进程数>,你当前的命令会被解析为:节点数2,第一个节点是192.168.1.128,进程数是192.168.1.129,这完全不符合规则,导致实际只在A上启动了进程,没有在B上启动rank 1的进程。rank 0的MPI_Send找不到接收方,一直阻塞,最终程序挂起。
正确的启动命令应为:
mpiexec -hosts 2 192.168.1.128 1 192.168.1.129 1 c:\code\TestMPI.exe
或使用计算机名称更可靠:
mpiexec -hosts 2 LAPTOP-TCEUD71B 1 LAPTOP-X2APOPUU 1 c:\code\TestMPI.exe
3. 在Windows 11上搭建多节点MS-MPI环境是否还需额外配置?
除已完成的配置外,还需注意:
- 确保两台机器的
smpd服务正常运行:可执行smpd -status查看状态,或执行smpd -install将其设置为自动启动(需重启机器); - 用
mpiexec -validate命令验证跨机连接是否正常; - 确认WiFi未开启AP隔离(家用WiFi默认关闭,部分公共WiFi会开启);
- 若遇到权限问题,可尝试在
mpiexec命令后添加-user <用户名>参数指定管理员账号。
4. 该问题是否与Windows 11或当前MS-MPI版本的已知问题相关?
当前问题主要是启动命令格式错误导致的,与Windows 11或MS-MPI v10.1.3的兼容性无关。MS-MPI v10.1.3对Windows 11支持良好,极少数情况下Windows 11的Defender实时保护可能拦截smpd通信,可临时关闭测试,但当前问题不需要此操作。
内容的提问来源于stack exchange,提问作者user29094781
相关产品推荐
相关产品推荐

