一、MS-MPI的安装
1.下载地址
https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx
MS-MPI有两个安装包,一个是SDK,另一个是MPI可执行程序,两个都需要安装。
2.安装
按正常软件的安装方式即可。
二、MS-MPI的第一个程序
1. 配置MS-MPI环境
1)MS-MPI的系统变量
在安装MS-MPI的同时,会自动添加4个系统环境变量,可以直接通过【计算机-属性- 高级系统设置-环境变量-系统变量】查看,也可以通过以下方式:
- 找到MS-MPI的bin目录:如本人安装在
D:\MPISDK\Microsoft MPI\Bin
- 在路径栏输入cmd,可以直接打开到该路径下的控制台
- 输入指令:
set MSMPI
- 可以看到
其中MSMPI_BIN包含MS-MPI的可执行文件等;MSMPI_INC包含MS-MPI的头文件等;MSMPI_LIB32和MSMPI_LIB64分别包含32位和64位的库文件。
2)配置MS-MPI+Visual Studio环境
新建一个VS工程,添加一个源文件(如main.cpp),在工具栏找到【项目-属性】,我们需要配置的地方有以下几个:
- 【C/C+±附加包含目录】:添加
$(MSMPI_INC);$(MSMPI_INC)\x86
- 【链接器-常规-附加库目录】:添加
$(MSMPI_LIB32)
- 【链接器-输入-附加依赖项】:添加
msmpi.lib
[注]:以上是在工程默认为32位,若需要64位时,将其中的 x86
换成 x64
,LIB32
换成 LIB64
即可。
2. 创建MS-MPI工程
以下是实现一个简单的MS-MPI多线程通信的例子。
#include <iostream>
#include <mpi.h>
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int RankID;
MPI_Comm_rank(MPI_COMM_WORLD, &RankID);
if (0 == RankID)
{
int SendNum = 16;
MPI_Send(&SendNum, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
else if (1 == RankID)
{
int RecvNum = 0;
MPI_Recv(&RecvNum, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
std::cout << "Receive from rank 0: " << RecvNum << std::endl;
}
MPI_Finalize();
return 0;
}
该程序实现的功能是进程0向进程1发送一个整数16,进程1接收到并打印到窗口。
其中,
MPI_Init(&argc, &argv);
:是MPI的初始化函数;MPI_Comm_rank(MPI_COMM_WORLD, &RankID);
:是获取该进程的ID编号,后面会用来判断该进程执行哪部分代码;if (0 == RankID)…else…
:这部分代码每个进程会也只会选择执行其中一个某一块,如进程0只会执行判断RankID==0
为true
的部分代码,进程1只会执行判断RankID==1
为true
的部分代码,该判断部分之外的代码是所有进程共有的代码,也就是全都会执行;MPI_Send(&SendNum, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
:按参数的顺序:SendNum
是要发送的数据,1是发送数据的数量,MPI_INT
是数据的类型位int型,1 是接收端的进程编号,0是发送端的进程编号,MPI_COMM_WORLD
是由所有进程组成的通信组,也就是通信子。
3. MPI程序的运行
MPI程序的运行方式和普通程序的运行方式有所不同,需要使用MPI自带的指令mpiexec.exe执行。这里介绍两种MPI程序的运行方式。
1)通过指令窗口执行
这是最常见的一种方法,
- 找到MPI的bin目录,在路径栏输入cmd,执行指令
mpiexec -n 2 "G:\Program\VS2015\MPITest001\Debug\MPITest.exe";
(路径使用绝对路径); - 也可以将MPITest.exe直接复制到bin目录下,执行
mpiexec -n 2 MPITest.exe
。
执行结果:
n用来指示创建进程的个数,2就表示创建两个进程,后面的exe可执行文件只在两个进程上都执行该程序。
[注]:在本机上做测试时,也可以不用 -n 2
来显示地指出创建进程个数,不使用 -n 2
时系统会默认在本机所有进程上执行。
2)通过修改Visual Studio调试指令和参数
Microsoft Visual Studio提供有将指令配置到工程中的方法,这样带来的好处是可以直接通过VS的运行执行多进程程序,而不需要到MPI的的bin目录下需要指令执行,有一定的方便性。配置的方法如下:
打开VS工程的【属性-调试-命令】:添加$(MSMPI_BIN)\mpiexec.exe
【属性-调试-命令参数】:添加-n 2 $(TargetPath)
执行结果:
[注]:1. 通过第2种方法运行MPI多进程程序时,无法调试,如果需要调试,就需要将配置到工程里的指令删去才可。
2. 在后续的开发中,根据需要改相应的指令即可。