(done) 自学 MPI (4) Environment Management Routines
url: https://hpc-tutorials.llnl.gov/mpi/environment_management_routines/
环境管理函数(例程)
这组例程用于查询和设置MPI执行环境,其用途包括初始化和终止MPI环境、查询进程标识、查询MPI库版本等。下面将介绍一些常用的例程。
例程包括:
1.MPI_Init
2.MPI_Comm_size
3.MPI_Comm_rank
4.MPI_Abort
5.MPI_Get_processor_name
6.MPI_Get_version
7.MPI_Initialized
8.MPI_Wtime
9.MPI_Wtick
10.MPI_Finalize
关于它们的具体介绍直接看参考链接,这里就不多讲了。
下面是一段 C 的样本代码(test.cpp),代码里的注释很有价值:
// test.cpp
// required MPI include file
#include "mpi.h"
#include <stdio.h>int main(int argc, char *argv[]) {
int numtasks, rank, len, rc;
// MPI_MAX_PROCESSOR_NAME是MPI定义的常量,表示主机名称的最大长度
char hostname[MPI_MAX_PROCESSOR_NAME];// initialize MPI
// 初始化MPI环境
// argc:指向参数个数的指针(通常传递main函数的argc地址)
// argv:指向参数向量的指针(通常传递main函数的argv地址)
// 设置MPI环境,为进程间通信做准备
// 必须在使用任何其他MPI函数之前调用
// 所有MPI进程都会执行这个调用
MPI_Init(&argc,&argv);// get number of tasks
// 获取通信域中的进程总数
// comm:通信域(这里是MPI_COMM_WORLD,表示包含所有进程的全局通信域)
// size:输出参数,返回通信域中的进程总数
// 让每个进程知道总共有多少个进程在并行执行
// 在代码中,numtasks变量将存储进程总数
// 如果有4个进程运行程序,所有进程的numtasks值都是4
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);// get my rank
// 取当前进程在通信域中的唯一标识符(排名)
// comm:通信域
// rank:输出参数,返回当前进程的排名(从0开始)
// 为每个进程提供一个唯一的ID,用于区分不同的进程
// 排名范围是0到size-1(size来自MPI_Comm_size)
// 在4个进程中,排名分别是0、1、2、3
MPI_Comm_rank(MPI_COMM_WORLD,&rank);// this one is obvious
// 获取运行当前进程的主机名称
// name:输出参数,存储主机名称的字符数组
// resultlen:输出参数,返回实际名称的长度
// 获取运行进程的计算机主机名
// 在集群环境中,可以知道进程运行在哪台机器上
MPI_Get_processor_name(hostname, &len);
printf ("Number of tasks= %d My rank= %d Running on %s\n", numtasks,rank,hostname);// do some work with message passing// done with MPI
// 清理MPI环境
// 清理MPI环境,释放所有MPI资源
// 必须在MPI程序结束前调用
// 调用后不能再使用任何MPI函数
// 注意:所有MPI进程都必须调用此函数
MPI_Finalize();
}
编译运行命令如下:
sudo apt-get update
sudo apt-get install mpich
sudo apt-get install openmpi-bin openmpi-doc libopenmpi-dev
mpicxx test.cpp
mpirun -np 4 ./a.out
我的电脑上运行结果如下:

