MPI — 1. 基本概念
相关概念与函数
MPI名词:communicator, rank, size
MPI函数:MPI_Comm_rank, MPI_Comm_size, MPI_Init, MPI_Finalize
- 如何理解MPI概念中的 communicator?
为完成某个并行计算的所涉及的进程合在一起的进程组称之为communicator, 会有一个“名字”可以区分,知道这个名字也可以知道这个组下面有哪些进程。这个是我自己总结的,可能不准确。下面是官方ppt中解释:
MPI processes can be collected into groups
--Each group can have multiple colors(some times called context)
--Group + color == communicator(it is like)
--The same group can have many names, but simple programs do not have to worry about multiple names
一个communicator会有多个名字,这个不知有何作用,日后有时间再研究
- rank,size
当知道了一个communicator后,会有rank,size这两个概念。size用于表示当前communicator中进程的数量,rank用于标识具体哪个进程,是用以int变量来表示的。这两个变量取值,分别通过MPI_Comm_rank(), MPI_Comm_size()来获取的。在MPI编程首先要是使用MPI_Init()函数来初始化,编程结束要用MPI_Finalize()来结束MPI进程,否则会产生异常。
查看MPICH中头文件'mpi.h', MPI_Comm_rank(), MPI_Comm_size()的定义如下:
MPI_Comm_rank(MPI_Comm comm, int *rank);
MPI_Comm_size(MPI_Comm comm, int *size);
其中MPI_Comm是MPI实现中communicator的类型定义,实际上是一个int类型。mpi.h是这样定义的:
typedef int MPI_Comm
下面代码中,MPI_COMM_WORLD是默认通信组,用来初始化MPI通信组名。
#define MPI_COMM_WORLD ((MPI_Comm)0x44000000)
int rank, size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
写一个简单的hello world代码,在各个进程中打印“hello world”
#include<mpi.h>
#include<iostream>
using namespace std;
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);
cout << "Hello World. I am " << rank << " of " << size << endl;
MPI_Finalize();
return 0;
}
运行结果如下:
mpicxx hello.cpp -o hello
mpiexec -np 3 ./hello
Hello World. I am 0 of 3
Hello World. I am 1 of 3
Hello World. I am 2 of 3