0%

MPI入门

在WSL里安装MPI非常方便,只需执行

1
sudo apt install -y build-essential mpich

即可。
这样就可以在终端中使用mpi了,但为了方便使用,还需在VSCode中添加路径。
在c_cpp_properties.json的includePath中添加”/usr/include/mpich”即可。

用mpi编写一个helloworld程序:

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc,char **argv){
int numprocs, myid;
MPI_Status status;
MPI_Init(&argc, &argv);//
MPI_Comm_rank(MPI_COMM_WORLD, &myid);//这里myid表示这个进程是第几个进程,如果myid是0则是第一个进程
MPI_Comm_size(MPI_COMM_WORLD, &numprocs); //numprocs表示总的进程数量
cout<<"helloworld\n";
MPI_Finalize();//
}

上述代码由许多值得注意的地方:

1.注意不能使用 bits/stdc++ 这个库,否则会出错。

2.main函数要带命令行参数。

3.MPI_Init函数表示从这一行开始,后面的代码会被并行执行,即在每个进程中执行一次。其他的MPI
函数必须在MPI_Init函数之后。

4.MPI_Comm_rank函数获得本进程是第几个进程,把进程号存储在myid中。第1个进程(也称为主进程)对应的myid是0,
第二个进程对应的myid是1……以此类推。

5.MPI_Comm_size得到进程的数量。

6.在网上查阅资料了解到,MPI_Finalize函数将并行部分终止,除了主进程外的进程都会被终止,主进程的串行部分还可以正常执行。但事实上我在本地运行程序时,MPI_Finalize函数之后的部分还是会被并行执行,我也不知道为什么。

写完之后,就可以在终端执行程序了。

image.png

用mpic++编译源代码,生成一个名为hw的可执行文件。再用mpirun运行文件,4表示4个进程,所以输出时4个helloworld。