You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两台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;
}

操作步骤

  1. 在每台设备上以管理员身份运行CMD,执行:
smpd -debug
  1. 在计算机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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:40:56