VS2019配置MPI开发环境:MS-MPI安装与并行程序运行指南
2026/9/16 23:33:12 网站建设 项目流程

前两天刚帮一个学弟在 VS2019 里调通 MPI 环境,他照着网上一堆教程折腾了两天都没成,最后发现不是漏了 SDK 安装包,就是项目配置里平台选错。说实话,MPI 在 Windows + Visual Studio 下的配置本身不算难,但网上很多教程要么只讲一半,要么直接拿 Linux 的命令来凑数,新手很容易卡在某一步就进行不下去。这篇我就按自己实际踩坑后整理的完整流程,从下载安装、项目配置到跑通第一个多进程程序,一层层给你拆开讲,保证你跟着走就能成。

1. 为什么要在 VS2019 里配 MPI,以及选哪款 MPI

1.1 MPI 是什么,能解决什么问题

MPI 全称 Message Passing Interface,是一套消息传递接口标准,专门用来写并行计算程序。你可以把它理解成一个小公司里多个员工之间互相传纸条的规则:每个员工手里有一份独立的工作清单,大家通过统一的传话方式互相协作,最后汇总结果。对应到程序里,每个员工就是一个独立进程,所谓“传纸条的规则”就是 MPI 库提供的那一堆函数,比如MPI_SendMPI_RecvMPI_Reduce等等。

在 Windows 平台上做 MPI 开发,最常用的实现是微软官方维护的 MS-MPI(Microsoft MPI)。它有两套东西要装:一个是运行时安装包msmpisetup.exe,负责让你编译出来的程序能跑起来;另一个是开发包msmpisdk.msi,提供mpi.h头文件和msmpi.lib库文件,编译的时候必须用到。很多教程只让你装其中一个,然后怎么配都会报错,问题往往就出在这里。

1.2 MS-MPI、MPICH、OpenMPI 怎么选

这个问题几乎每个新手都会问。简单说:你是 Windows + VS2019,那就老老实实选 MS-MPI。虽然 MPICH 和 OpenMPI 也支持 Windows,但安装配置的折腾程度和 VS2019 的集成体验都远不如 MS-MPI。打个比方,MPICH 和 OpenMPI 更像是为 Linux 集群量身定做的,Windows 支持只是“能跑”;而 MS-MPI 是微软自家东西,跟 Visual Studio 配合最顺,文档也全。尤其是你只是上课、做作业、跑跑小规模并行程序,完全没必要给自己找额外麻烦。

MS-MPI 也有一些自身限制,比如多机运行时的配置不如 Linux 下 SSH 方案灵活,但单机多进程调试绝对够用。咱们这篇文章的目标就是先把单机多进程跑通,等你真需要上多机集群了,再研究跨节点部署也不迟。

1.3 VS2019 你还需要提前准备好什么

除了 MPI 相关安装包之外,你的 VS2019 必须已经装好“使用 C++ 的桌面开发”这个工作负载。方法很简单:打开 Visual Studio Installer,找到 VS2019,点“修改”,在“工作负载”选项卡里勾选“使用 C++ 的桌面开发”,右侧会包含 MSVC 编译器和 Windows SDK 等必要组件。如果你之前只装了 C# 或者 Python 开发模块,那后面新建项目时连 C++ 空项目模板都找不到,更别提编译了。

这里还要提醒一句:VS2019 的 Community 社区版对个人学习完全免费,不需要什么产品密钥,直接在官网下载安装器装就行。学生党、个人开发者不要被网上那些“密钥”给绕晕了。

2. 先把 MS-MPI 装对:两个安装包缺一不可

2.1 下载和安装细节

进入微软官网的 MS-MPI 下载页面,能看到两个文件的下载链接:

  • msmpisetup.exe:MS-MPI 运行时,最终跑程序时靠它提供mpiexec.exemsmpi.dll
  • msmpisdk.msi:MS-MPI 开发包,包含头文件和库文件,编译时必需。

建议先装msmpisetup.exe,再装msmpisdk.msi,装的时候一路 Next 就行。安装路径默认是C:\Program Files\Microsoft MPI\C:\Program Files (x86)\Microsoft SDKs\MPI\。注意后者是 32 位 SDK 路径,但里面同时存放了可以编译 64 位程序用的库目录。

有个容易忽略的点:安装完成后最好重启一次命令行窗口,因为安装程序会把C:\Program Files\Microsoft MPI\Bin加入系统 PATH。不重启的话,部分终端可能读不到新的环境变量,导致你敲mpiexec提示“不是内部或外部命令”。

2.2 验证安装是否正确

安装完先做个快速自检。打开命令行(Win+R 输入 cmd,或者用 PowerShell 都行),输入:

mpiexec -help

如果能刷出一大段英文帮助信息,说明运行时安装成功,环境变量也正常。接着检查开发包:

dir "C:\Program Files (x86)\Microsoft SDKs\MPI\Include\mpi.h" dir "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64\msmpi.lib"

第一条能看到mpi.h就说明头文件在;第二条能看到msmpi.lib就说明 64 位库文件在。顺便说一句,如果之后你的程序是 x86 平台编译,那库文件路径要用Lib目录而不是Lib\x64

2.3 关于 PATH 与 32 位/64 位的坑

我在给别人排查环境时,遇到最多的就是 PATH 没生效和 32/64 位搞混。MS-MPI 安装后,mpiexec.exe位于C:\Program Files\Microsoft MPI\Bin\,这个路径默认会进 PATH。但如果你之前自定义安装过 MS-MPI,装到了别的盘,那就得手动把Bin目录加到系统环境变量里。

另一个坑是很多人的 Windows 系统里已经装有旧版 MS-MPI,新版装上去之后,mpiexec调用的可能还是旧版本路径。建议在命令行里执行:

where mpiexec

看看实际指向的是哪个目录,如果是C:\Windows\System32\mpiexec.exe这种,很可能系统里残留了老版本运行时,最好先卸载干净再装新版。

3. 新建项目并配置 VS2019 开发环境

3.1 新建 C++ 空项目

打开 VS2019,选择“创建新项目”,然后在模板列表里找到“空项目”,注意筛选条件那里语言选 C++。项目名称你可以起得像样点,比如MPIDemo。建完之后,右键源文件目录 → 添加 → 新建项,选 C++ 文件(.cpp),命名main.cpp

这个阶段先别急着写代码,因为项目配置还没弄好,直接写代码也会在编译时找不到头文件。先把环境配好,后面写代码就是水到渠成的事。

3.2 配置包含目录和库目录

右键项目名称(注意是项目而不是解决方案)→ 属性,打开项目属性页。这一步是整篇文章的重头戏,请对照着做。

首先,在属性页左上角“配置”一栏选“所有配置”,在“平台”一栏选“所有平台”,这样后面配置一次,Debug/Release、Win32/x64 都能共用,省得来回切。当然,如果你确定只跑 x64,那只选 x64 也行,但新手我劝你还是选“所有平台”,可以避免以后切换配置又踩一遍坑。

接下来展开“VC++ 目录”:

  • 在“包含目录”里添加C:\Program Files (x86)\Microsoft SDKs\MPI\Include
  • 在“库目录”里添加C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64

其中库目录要特别说明:Lib\x64是 64 位库,Lib是 32 位库。如果你的 VS 解决平台是x64,就填Lib\x64;如果的是Win32,就填Lib。因为前面我让你选了“所有平台”,所以这里填Lib\x64只对 x64 生效,切换到 Win32 时会找不到库,别急,切到 Win32 时再改成Lib就行。最保险的做法是:先改成 x64,填好 x64 对应的库路径;再切到 Win32,填Lib。后面我会提醒你注意这个。

3.3 链接器配置和预处理器细节

继续在项目属性页里,展开“链接器” → “输入”,找到“附加依赖项”,把msmpi.lib添加进去。这里直接写文件名就行,因为库目录已经指到具体路径了。如果你前面配置的是“所有平台”,那这里填一次就能通用;如果你分平台配置,就每个平台都填一次。

关于预处理器,很多教程会让你额外定义MPICH_SKIP_MSMPI之类的东西。我的实际经验是,如果只是跑最基础的 MPI 程序,不定义也能正常编译。只有当你同时引入了一些跟 MPI 类型定义冲突的头文件时,才需要加。所以这一步先留空,遇到编译错误再补。这里就先记着有这回事。

另外,如果你的程序里用到了一些传统 C 函数(比如sprintffopen),在 VS2019 的默认编译设置下可能会报安全警告甚至错误。可以先在“C/C++” → “预处理器” → “预处理器定义”里加一个_CRT_SECURE_NO_WARNINGS,能省很多烦心事。这个不算 MPI 专属问题,但新手容易在这里卡住。

4. 写第一个 MPI 程序并在 VS 里跑起来

4.1 完整代码与逐行解释

直接上一个最经典的 Hello World,先确保它能编译能跑,再谈别的。

#include <stdio.h> #include <mpi.h> int main(int argc, char* argv[]) { MPI_Init(&argc, &argv); int rank, size; char processor_name[MPI_MAX_PROCESSOR_NAME]; int name_len; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Get_processor_name(processor_name, &name_len); printf("Hello from process %d of %d on %s\n", rank, size, processor_name); MPI_Finalize(); return 0; }

逐行解释一下核心函数:

  • MPI_Init(&argc, &argv):初始化 MPI 环境。所有 MPI 程序必须在一开始调用它,它的作用是启动并初始化消息传递所需的基础设施。
  • MPI_Comm_rank(MPI_COMM_WORLD, &rank):获取当前进程的编号。MPI_COMM_WORLD是全局通信子,代表当前参与计算的所有进程;rank是当前进程在这个通信子中的唯一编号,从 0 开始。
  • MPI_Comm_size(MPI_COMM_WORLD, &size):获取通信子中的进程总数。比如你用mpiexec -n 4启动了 4 个进程,那size就是 4。
  • MPI_Get_processor_name(processor_name, &name_len):拿到当前进程所在主机名。本机调试时,所有进程的主机名一般都相同。
  • MPI_Finalize():结束 MPI 环境,所有 MPI 程序在退出前最好都调用它。

这段代码不难理解,关键是理解并行模型:同一个 exe 被运行 N 次,每个进程各自执行同一份代码,靠rank区分自己是谁。

4.2 编译运行单进程

把代码粘贴进main.cpp,点“本地 Windows 调试器”按钮(快捷键 F5),或者直接 Ctrl+F5 运行。如果你的配置都正确,程序会直接跑起来,输出类似:

Hello from process 0 of 1 on DESKTOP-ABC123

因为 VS 默认启动的就是单进程,所以size是 1,rank是 0。能走到这一步,说明头文件、库、链接器配置都通了。如果这里报了错,那问题基本定位在 3.2 和 3.3 的配置上,可以回过去再确认一遍路径和平台是否匹配。

4.3 用 VS 调试参数实现多进程运行

单进程跑通只是第一步,MPI 的真正威力在于多进程。在 VS2019 里,我们可以通过调试参数让程序以多进程方式跑起来,不需要每次跑到命令行里敲命令。

右键项目 → 属性 → “调试”,在“命令参数”里填:

-n 4

然后点“本地 Windows 调试器”或者 F5 运行,你会看到程序真的以 4 个进程跑起来了,输出类似:

Hello from process 0 of 4 on DESKTOP-ABC123 Hello from process 3 of 4 on DESKTOP-ABC123 Hello from process 1 of 4 on DESKTOP-ABC123 Hello from process 2 of 4 on DESKTOP-ABC123

注意输出的顺序是随机的,因为多个进程是并发运行的,谁先执行到 printf 不一定,这正体现了并行的特性。

如果你不想改 VS 配置,也可以直接命令行运行。先把代码编译生成 exe,然后在项目输出目录(一般在x64\Debug\Debug\),打开命令行,执行:

mpiexec -n 4 MPIDemo.exe

效果完全一样。VS 调试本质上也是封装了类似的命令。

4.4 练手:真正算点东西的并行程序

Hello World 只能证明环境通了,还不算真正理解 MPI。我再给一个简单的标量求和示例,每个进程算一段数字之和,最后用MPI_Reduce汇总到 0 号进程:

#include <stdio.h> #include <mpi.h> int main(int argc, char* argv[]) { MPI_Init(&argc, &argv); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int local_sum = rank + 1; int global_sum = 0; MPI_Reduce(&local_sum, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (rank == 0) { printf("Total sum = %d\n", global_sum); } MPI_Finalize(); return 0; }

如果mpiexec -n 4,每个进程的local_sum分别是 1、2、3、4,最终global_sum就是 10。MPI_Reduce把各进程的local_sum收集起来,在 0 号进程上执行“求和”操作。建议你把这段代码也跑一遍,感受一下进程之间是怎么协作的。

5. 踩坑实录:常见问题与排查技巧

5.1 编译期报错的快速定位

编译期最常见的就是找不到mpi.h或者链接时找不到msmpi.lib。我整理了一张速查表,你对照排查基本能秒杀。

错误现象常见原因解决办法
编译报错:无法打开包含文件“mpi.h”包含目录没配或路径不对检查项目属性 → VC++ 目录 → 包含目录,确保有C:\Program Files (x86)\Microsoft SDKs\MPI\Include
链接报错:LNK1104 无法打开文件“msmpi.lib”库目录没配,或平台不匹配确认配置了库目录,且 x64 用Lib\x64,Win32 用Lib
链接报错:LNK2001 无法解析的外部符号没填附加依赖项,或者填错了库名在链接器 → 输入 → 附加依赖项里加msmpi.lib
编译警告 C4996使用了fopen等旧函数在预处理器定义里加_CRT_SECURE_NO_WARNINGS

有一个细节值得强调:属性页左上角一定要看清楚当前“配置”和“平台”。我之前帮人排查,他说自己明明加了包含目录但还是找不到mpi.h,结果一看,他只在 Debug 下加了,编译的时候用的是 Release,当然找不到。所以新手就直接用“所有配置”、“所有平台”来配,可以避免这种乌龙。

5.2 运行期报错的快速定位

编译通过但运行报错的情况,多数出在运行时安装或环境变量上。

错误现象常见原因解决办法
提示“无法启动此程序,因为计算机中丢失 MSMPI.dll”只装了开发包,没装运行时安装msmpisetup.exe
提示“mpiexec 不是内部或外部命令”PATH 没配置或旧版本残留重装最新版,重启命令行,用where mpiexec检查路径
运行后只输出 1 个进程,-n 4没生效VS 调试配置里命令参数没填对项目属性 → 调试 → 命令参数填-n 4,或改用命令行mpiexec -n 4 程序.exe
MPI_Init返回错误码或者崩溃环境变量异常,或多个版本冲突彻底卸载旧版 MS-MPI,重装一致版本;确保运行和开发包同版本

运行期问题里最常见的就是只装了一半。记住口诀:要编译,装 SDK;要运行,装 Runtime;两个都要,别偷懒

5.3 多机运行和跨节点扩展

有人可能会问,单机跑通了,怎么在多台机器上跑?这里简单提一下方向:MS-MPI 支持通过mpiexec -hosts指定多台主机。例如:

mpiexec -hosts 2 node1 node2 -n 8 MPIDemo.exe

但多机部署要解决的不仅是命令语法,还包括两台机器上都要装 MS-MPI、都需要有程序 exe、防火墙要放行相关端口、最好保证两台机器之间能够免密访问等。这些配置比单机复杂不少,新手不建议一上来就搞多机,先把单机多进程和 MPI 的编程语义吃透,后面再逐步过渡到多节点。

5.4 几个实用小技巧

分享几个我实际用的比较顺手的技巧:

  • 如果 F5 调试时想看到printf输出,建议在MPI_Finalize()前面加一句fflush(stdout),否则部分进程的输出可能会被缓冲住,顺序混乱或者看不到。
  • 程序里如果要用相对路径读写文件,注意mpiexec启动时的工作目录和 VS 直接运行时的工作目录可能不同,建议用绝对路径或者先打印一下GetCurrentDirectory看看。
  • 在 VS 属性页里,调试一栏的“工作目录”也可以设置,设为 exe 所在目录能减少踩坑。
  • 如果调试多进程时想看每个进程分别执行到了哪里,可以在 VS 里直接给main打断点,然后按 F5 进入调试。MS-MPI 在 VS 下可以附加调试,但比较复杂,新手建议先用printf+fflush大法排障。

6. 配好之后:一个进阶小练习与下一步建议

如果你已经成功跑通了上面的 Hello World 和并行求和示例,说明 VS2019 配置 MPI 环境这件事算是彻底拿下了。接下来想让这个环境真正产生价值,我建议你按这个顺序继续练习:

第一,把 4.4 的示例改成每个进程计算一段连续整数和,比如 0 号进程算 1 到 100,1 号进程算 101 到 200,最后汇总得到总和,体会“分而治之”的并行思路。第二,去了解一下MPI_SendMPI_Recv的点对点通信,不要一上来就看一堆集合通信的函数,先把两个进程互发消息的程序写出来,你才能真正理解 MPI 的数据交换模型。第三,等你对消息传递有感觉了,再去翻集合通信里的MPI_BcastMPI_ScatterMPI_Gather,你就会发现它们本质上都是在做不同形式的“多人协作”。

我给自己的学生做练习时,经常用一句话概括调试阶段的心态:MPI 程序跑出错误不是环境问题,就是你的逻辑问题。环境问题占一半,逻辑问题占另一半。前者靠这篇文章能解决,后者只能靠多写多试。比如最常见的并发问题就是多个进程同时 printf,输出交错在一起,这不是程序“错了”,而是并行程序天然就是这样的,你得习惯从“多进程视角”去看运行结果。

在实际使用中,我个人最大的体会是:VS2019 配 MPI 这件事,环境本身不复杂,复杂的是平台位数的匹配和安装包是否齐全。你只要记住 x64 配Lib\x64、Win32 配Lib,两个安装包都装上,90% 的问题都不会出现。剩下 10% 的细节问题,回来对照第 5 节的速查表基本都能解决。希望这篇“超细”的教程能让你少走点弯路,顺利迈出并行编程的第一步。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询