尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Win10下MPICH2安装全指南:从smpd服务到环境变量排坑

Win10下MPICH2安装全指南:从smpd服务到环境变量排坑 1. 为什么Win10装MPICH2比想象中麻烦问题的根源要先搞清楚先说结论MPICH2本身是一个老古董级别的软件它的最后一个官方稳定版本1.4.1p1发布于2013年前后专门针对的是Windows 7/8那个时代。而Win10从内核、安全机制到服务管理方式都做了大量改动两者之间没有做向后兼容的适配。所以你会发现在Win10上装MPICH2每一步都像是在走钢丝。1.1 MPICH2的官方现状要清楚你在装一个什么样的软件MPICH2是Argonne国家实验室推出的MPI并行计算实现很多高校的并行计算课程、数值计算实验、课题组的科研代码都用它。但要注意官方后来把开发重心转移到了MPICH 3.x系列而Windows版本的MPICH2停留在1.4.1p1后就基本处于不更新状态了。这意味着什么意味着官方安装包默认情况下就是给老系统设计的。很多同学第一次安装时下载安装包、双击Next、一路点到底然后在cmd里输入mpiexec -help弹出一堆英文帮助以为装好了。等到真正跑mpiexec -n 4 hello_mpi.exe时各种诡异的错误就来了。这其实不是你不会装而是缺少了对MPICH2在Win10上工作方式的完整认知。我这里用的是Windows 10专业版22H2以64位系统为例。如果你的Win10是家庭版或者版本较旧操作上会有些许差异但核心思路完全一致。最好全程使用管理员账号操作这会省掉后续80%的权限问题。1.2 Win10对老软件不友好的三个关键点Win10下安装老软件最烦人的三个机制恰好全部命中了MPICH2的要害UAC用户账户控制安装程序需要提升权限但MPICH2的安装包对UAC的处理比较粗糙。装完之后的很多组件比如注册DLL、启动smpd服务都需要手动去提权装完不等于能用。Windows安全中心与防火墙MPICH2运行时要靠smpd服务进行进程通信和任务调度这个服务要监听网络端口。Win10防火墙默认会拦截非白名单程序的入站连接而MPICH2不在白名单里。杀毒软件的实时防护也常常把MPICH2的关键DLL或生成的临时文件误报为风险项直接隔离导致运行缺件。服务权限模型MPICH2自带的smpd服务安装程序写得很粗糙它在Win10的权限模型下容易注册成一个本地系统账户服务但登录时又不会正常启动。很多人在这一步卡住报错信息常常是服务无法启动或者smpd 无法连接。所以如果我让你先把系统安全中心、Windows Defender防火墙的实时防护临时关掉这不是乱来而是在规避老软件和新系统之间的兼容性冲突。当然装完跑通之后记得重新开启别长期裸奔。2. 安装前的准备动作十分钟能省下三个小时这一步主要解决装一半挂掉和装完马上缺DLL的问题。我自己的安装经历里很多人是直接装、装完就跑代码、跑代码就报错、报错就查半天最后发现是环境问题。这个顺序完全搞反了。2.1 安装包的选择不是越新越好更不是乱下载关于MPICH2安装包我强烈建议用官方渠道的mpich2-1.4.1p1-win-x86-64.msi注意看清结尾是x86-64而不是x86。虽然有第三方社区做过Win10兼容性修复版本但来源不保证干净科研机器上出了问题不好排查。下载的时候顺便确认一下安装包的哈希值官方有SHA1校验值。用PowerShell执行Get-FileHash命令对比一下再装。这个习惯养成之后以后装任何软件都受益。另外如果你的课程或课题没有强制要求MPICH2我会建议直接考虑微软的MS-MPI它对Win10和Win11的兼容性要好得多。但很多学校教材、老代码还是指定要MPICH2所以这篇文章还是把MPICH2的安装讲透。2.2 系统层面的准备不是流程化操作是有明确目的的在双击安装包之前按下面的清单逐项检查以Administrator身份登录或者至少确保当前用户有管理员权限关闭用户账户控制UAC控制面板 → 用户账户 → 更改用户账户控制设置拉到最底部的从不通知临时关闭Windows安全中心的实时防护设置 → 隐私和安全性 → Windows安全中心 → 病毒和威胁防护 → 管理设置 → 关闭实时保护临时关闭Windows Defender防火墙控制面板 → Windows Defender防火墙 → 启用或关闭Windows Defender防火墙 → 全部选关闭确保用户名是英文系统路径里没有中文坑很深后面详细说特别说明一句UAC设为从不通知之后你的系统权限模型会变得宽松适合做老软件兼容性测试。跑通MPICH2之后记得把UAC调回默认级别。Windows安全中心和防火墙同理装完、验证完再打开。2.3 安装路径的选择一个很多人忽略但又很关键的细节安装路径我建议直接放在C:\MPICH2不要安装在默认的C:\Program Files\MPICH2更不要装到Program Files (x86)目录下。原因有三Program Files目录的访问权限在Win10下管得很严MPICH2运行时要往自己的安装目录里写临时文件权限不够就会静默失败MPICH2的编译器对接工具包括后面要配置的smpd服务、环境变量对带空格的路径处理有bug路径带空格会导致服务找不到可执行文件Program Files (x86)是32位程序的默认目录MPICH2的64位版本装在x86文件夹里表现就是明明装对了编译器却提示找不到头文件所以安装时选择自定义安装方式直接把安装路径改成C:\MPICH2。这也是为什么我叫它排坑因为网上很多教程根本不提这回事。3. 安装与手动后处理真正决定成败的是你装完之后做了什么安装包本身点起来很快但在Win10上安装向导结束之后只完成了大约60%的部署。剩下的40%需要你手动去补。3.1 安装过程中的三个关键选择双击mpich2-1.4.1p1-win-x86-64.msi后基本是Next、Next路线。有这三个地方要特别注意安装类型选Everyone而不是Just me。选Just me会导致smpd服务只注册到当前用户换一个用户登录环境变量就找不到了中间会弹出提示要注册smpd服务这个必须勾选。虽然注册完之后可能启动不了但后续是可以修复的最后一步的MPI Environment Setup窗口中会让你填用户名和密码这是用来注册smpd服务的。填入当前管理员账户的密码注意用户名要填成主机名\用户名的格式比如DESKTOP-ABC123\admin装完之后打开安装目录确认一下有没有这几个关键文件mpiexec.exe、smpd.exe、mpich2.dll、mpi.h。缺哪一个后面就一定会报对应错误。3.2 注册DLL文件这一步是Win10下安装MPICH2最容易翻车的地方MPICH2安装完成后很多DLL文件不会自动注册需要手动调用regsvr32注册。比较关键的是mpich2.dll。你打开命令行管理员模式进入MPICH2的bin目录执行regsvr32 mpich2.dll如果提示注册成功说明没有任何问题。但如果你用的是Win10较新版本常常会看到已加载mpich2.dll但没有找到DllRegisterServer入口点之类的报错这大概率是因为你下载的MPICH2版本对应的运行库是32位而你用了64位的regsvr32。解决方式是用系统里的32位版注册工具C:\Windows\SysWOW64\regsvr32.exe C:\MPICH2\bin\mpich2.dll注意SysWOW64文件夹里的regsvr32.exe才是32位版本别搞混了。这一步做完再去跑程序会发现缺dll的报错概率大幅降低。3.3 手动修复smpd服务注册之后十有八九启动不了安装向导虽然会尝试注册smpd服务但在Win10下注册结果通常是服务存在但启动失败。你可以在WinR输入services.msc打开服务管理器找到smpd服务如果它处于已停止状态先尝试右键启动。如果启动报错看下面修复流程打开命令行管理员进入MPICH2的bin目录手动卸载并重新注册服务smpd -uninstall smpd -install -password yourpassword-smpd -install会注册一个Windows服务默认登录身份是本地系统账户。但这个账户在没有密码的情况下跑MPICH2的进程通信会出现身份校验失败。所以更稳妥的做法是sc config smpd obj .\Administrator password 你的密码执行成功后再去服务管理器里手动启动smpd。此时如果服务能正常启动就说明服务修复成功了。我再提一句这些命令必须在管理员命令行下运行否则会提示拒绝访问。见到拒绝访问别慌换个提权方式重新打开cmd再试。3.4 环境变量的配置少了这一步编译器根本找不到MPI安装向导结束后可能自动配置了MPICH2的环境变量也可能没有取决于系统版本。手动配一遍最靠谱。右键此电脑 → 属性 → 高级系统设置 → 环境变量在系统变量中进行以下配置新增系统变量MPICH2_HOME值为C:\MPICH2编辑Path变量追加C:\MPICH2\bin注意结尾分号配置完成后重新打开一个新的命令行窗口执行where mpiexec如果能输出mpiexec.exe的路径说明环境变量生效了。重要提示环境变量修改完成之后必须关闭所有旧的命令行窗口再重新打开。旧窗口不会加载新配置这一步有无数人踩过。4. 编译环境的匹配别让编译器成为新的拦路虎MPICH2装好只意味着运行时环境就绪。如果你需要写代码、编译MPI程序那就还有编译环境的坑要处理。这部分网上讲得非常乱我直接用自己验证过的路径说明。4.1 编译器选择VS版本太新会出链接错误MPICH2 1.4.1p1的库文件是用老版本VC编译的所以跟新版本Visual Studio的C运行时库会出现链接不兼容。具体表现是编译时报错找不到某些符号或者直接出现LNK2038、LNK1104之类的链接器错误。我自己试下来Visual Studio 2017及以上版本如果直接拿来编译MPICH2程序并链接mpich2.lib在安装目录的lib文件夹里大概率会失败。这并不是你代码有问题而是工具集版本不匹配。三个可行方案按优先级排列方案A装VS2013或VS2015的社区版用默认工具集编译MPICH2程序几乎不会出问题。这是最稳妥的路线方案B用VS2017/2019/2022但把项目的平台工具集改成Visual Studio 2015(v140)具体在项目属性 → 常规 → 平台工具集中选择。改完之后重新编译兼容性问题会明显减少方案C不使用IDE直接用命令行编译如果你只是做作业或者验证MPI逻辑完全可以用gccMinGW-w64或者老版本VC的cl.exe从命令行编译配合MPICH2的include和lib目录。我个人在实际项目中多数时候用方案B因为VS2019的调试器比老版本好用太多改个工具集成本又不高。4.2 头文件和库文件目录配置不管用哪个编译器代码编译时需要让编译器知道MPICH2的头文件和库文件在哪。VS中做如下配置项目属性 → C/C → 常规 → 附加包含目录添加C:\MPICH2\include项目属性 → 链接器 → 常规 → 附加库目录添加C:\MPICH2\lib项目属性 → 链接器 → 输入 → 附加依赖项添加mpich2.lib4.3 最小验证先写第一个MPI程序用最简单的方式验证一下编译环境是否正常。创建一个test.c文件内容如下#include stdio.h #include mpi.h int main(int argc, char *argv[]) { int rank, size; MPI_Init(argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); printf(Hello from process %d of %d\n, rank, size); MPI_Finalize(); return 0; }在编译器中编译链接成功后会生成test.exe。此时运行mpiexec -n 4 test.exe如果输出了0、1、2、3四个进程的Hello信息说明从编译到环境变量到运行时全都打通了。如果这一步输出有问题回到前面的步骤逐项排查。5. 跑通mpiexec的完整工作流单机多进程跑起来才叫装成功很多人跑到编译成功就以为万事大吉结果在命令行里跑多进程任务的时候又被卡住。这里要说明一个关键认知在Win10下MPICH2的单机多进程运行不是简单地mpiexec -n 4就完了它的进程调度依赖smpd服务而smpd服务的网络通信又依赖hosts配置和防火墙放行。所以你需要把整个运行链路打通。5.1 hosts文件与主机名配置本机通信的隐藏前提如果smpd服务在运行但mpiexec -n 4还是连接失败、一直卡住不动多半是hosts文件里没有本机主机名与实际IP的映射。编辑C:\Windows\System32\drivers\etc\hosts文件在末尾追加一行127.0.0.1 你的主机名注意你的主机名可以在命令行里通过hostname命令查看。为什么要加这行呢因为MPICH2的进程管理器在启动子进程时会尝试通过主机名去解析本机地址。Win10的DNS解析链路在某些网络环境下无法快速返回正确结果导致mpiexec等半天没有反应。直接写进hosts是最快、最有效的办法。5.2 用命令行完成完整测试四个进程跑通确认smpd服务正常运行后打开管理员命令行进入MPICH2目录依次执行以下测试smpd -status如果输出is running说明服务正常。如果没有任何输出或提示连接失败回看第3.3节重新修复服务。然后运行mpiexec -n 4 C:\MPICH2\examples\hello_mpi.exe这里用MPICH2自带的示例程序先跑一次不要一开始就跑自己编译的程序。如果示例程序能正常输出说明运行容器的链路全部正常你编译的程序跑不起来就该查代码本身了。5.3 多机运行时才需要的配置单机用户可跳过如果课程要求做多机集群除了每台机器都安装MPICH2并保持相同环境变量之外还需要做三件事所有机器使用相同的Windows账户和密码或者建立账户映射、在所有机器的hosts中写入全部节点的IP和主机名、确认防火墙放行MPICH2在TCP/UDP上的通信端口默认是8676端口。这块容易在集群联调时变成一个深坑单机一切正常一旦加上第二台机器就报错。多数情况就是hosts映射不统一或者账户密码不一致。不要以为MPICH2能自动发现机器它完全依赖静态配置。6. 实测中的常见报错与排查链路遇到问题别再瞎试了写这个章节是因为我自己以及身边同门、网友在安装过程中遇到的报错其实高度集中。把高频问题整理成一张排查表比一条条翻英文文档效率高很多。6.1 常见错误速查表报错信息核心原因快速解法无法启动此程序因为计算机中丢失 mpich2.dllDLL未注册或路径未配置用regsvr32注册bin目录中mpich2.dll确认环境变量PATH正确服务名无效 或 拒绝访问smpd服务未正确安装或权限不足管理员命令行执行smpd -uninstall再smpd -install -password 密码mpiexec 不是内部或外部命令PATH未配置重新配置环境变量并确保已打开新的cmd窗口系统找不到指定的文件运行路径错误或文件被安全软件隔离检查杀毒软件隔离区恢复文件换绝对路径运行mpiexec 连接 smpd 失败smpd服务未启动或hosts未配置服务管理器确认smpd运行检查hosts中主机名映射Visual Studio链接错误 LNK2038工具集版本不匹配项目属性中改平台工具集为v140启动服务时错误1079服务登录身份设置不对sc config smpd obj .\Administrator password 你的密码6.2 一个真实的踩坑全过程防火墙导致的静默失败说来你可能不信我遇到最隐蔽的一个坑是Windows安全中心的病毒和威胁防护里勒索软件防护的受控文件夹访问功能它把MPICH2对bin目录的写入行为当成恶意操作直接拦掉了。表现就是smpd服务已经启动但任务卡死没有明确的报错日志里也没有详细记录。排查时我先去事件查看器里翻Windows日志和应用程序日志发现被拦截的审计记录。然后进Windows安全中心把受控文件夹访问功能临时关掉再把MPICH2的bin目录添加为受信任的应用重启smpd服务问题才真正消失。这个经验说明有时候不要只看报错本身Win10的实时保护受控文件夹访问防火墙这三个安全层都会和MPICH2产生冲突。如果你装了第三方杀毒软件比如360、火绒它们又叠加了一层过滤驱动情况只会更复杂。建议安装调试期间把三方杀软临时退出跑通之后再重新开启并添加信任。6.3 虚拟机和Win10系统下的额外提醒如果你是在VMware虚拟机里装Win10再跑MPICH2还需要注意网络适配器模式。建议将虚拟机的网络模式设置为NAT或者桥接并保证虚拟机主机名和smpd服务之间能正常通信。闭坑要点是VMware默认的NAT模式下主机名解析可能因为虚拟网络适配器未启用而导致失败。另外分配内存时要留够至少2GB给虚拟机MPI多进程测试时各进程都会占用内存内存不足会出现启动进程数少于预期的情况。6.4 如果实在不行换MS-MPI的替代路径最后说一条退路。如果你的课程没有强制要求必须用MPICH2而你的实际目标是完成MPI并行计算的实验和代码编写那么改用Microsoft MPIMS-MPI是更省心的选择。MS-MPI的安装包对Win10和Win11兼容性做了完整的适配支持最新的Visual Studio环境变量和smpd服务也不需要用老掉牙的方式去手动修。在微软官网搜索MS-MPI下载安装即可。但如果你跟我一样因为老代码、教材版本或者学校服务器统一使用的是MPICH2那就按照上面第2到第5章的顺序一步步来。把环境变量、DLL注册、smpd服务、防火墙这几件事做对MPICH2在Win10下还是能稳定运行的。我个人的体会是这类老软件在Win10上从装不上到能用最耗时间的往往不是安装本身而是排查问题时的无头苍蝇式尝试。把安装过程拆成系统准备、安装部署、服务修复、环境变量、编译验证、运行验证这六步每一步做完先验证再进下一步你就不会反复掉进同一个坑里。最值得记住的一点运行mpiexec之前先去确认smpd服务是正在运行状态这个检查十秒钟能省下来的排查时间是以小时计的。
返回列表