MPICH

MPICH

MPI(Message Passing Interface)是目前发展较快、使用面较广的一个公共的消息传递库,顾名思义,就是在现有机器的软硬件通信基础上,实现了并行应用程序中各并行任务之间的相互通信、协调和同步功能,并对这些并行任务进行管理。

MPI 具有可移植性、高效性、灵活性和易用性的特点,不仅适用于具有分布式内存的大型机、工作站机群,也可用于具有共享内存的大型机。

MPI 标准的常用实现有 OpenMPI 和 MPICH。

MPICH 是 MPI 的一种高效便携式实现标准,通过安装 MPICH 构建 MPI 编程环境,从而进行并行程序的开发。MPICH 是 MPI(Message-Passing Interface)的一个应用实现,支持最新的 MPI-2 接口标准(现在好像已经有 MPI-3 了),是用于并行运算的工具。

安装

1
sudo apt-get install mpich

如果需要卸载:

1
sudo apt-get --purge remove mpich

测试安装

随便找个地方新建一个测试文件,mpi_hello.cpp,代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string.h>
#include <mpi.h>
using namespace std;

const int max_string = 100;

int main ()
{
	int comm_sz=0;
	int my_rank=0;
	char greeting[max_string];
	
	MPI_Init(NULL,NULL);
    MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
    MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);

	 if(my_rank!=0){
		sprintf(greeting,"Greetings from process %d of %d!",my_rank,comm_sz);
		MPI_Send(greeting,strlen(greeting),MPI_CHAR,0,0,MPI_COMM_WORLD);
	}
	else{
		cout<<"Greetings from process "<<my_rank<<" of "<<comm_sz<<"!"<<endl;
		for(int i=1;i<comm_sz;i++){
			MPI_Recv(greeting,max_string,MPI_CHAR,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
			cout<<greeting<<endl;
		}
	}
	
	MPI_Finalize ();
	return 0;
}

编译

1
mpicxx -g -Wall -o mpi_hello.o mpi_hello.cpp
  • mpicc:编译 C 程序
  • mpicxx:是编译 C++ 程序
  • -g:允许使用调试器
  • -Wall:显示警告(W 大写)
  • -o outfile.o:编译出可执行的文件,文件名为 outfile.o
  • -02:告诉编译器对代码进行优化

编译完成后,开始运行,可由 -n 后面的数字来调节创建进程数。

1
mpirun -n 4 ./mpi_hello.o

最后得到的结果为,有可能顺序不一样

1
2
3
4
Greetings from process 0 of 4!
Greetings from process 1 of 4!
Greetings from process 2 of 4!
Greetings from process 3 of 4!

远程并行