MPI程序的总体结构

图5-1 MPI程序的框架结构



讲解:
MPI程序可以分为四大部分,即MPI头文件的声明部分,MPI用到相关变量的声明部分,MPI程序的初始化和结束部分,MPI程序体即执行部分。
任何一个MPI程序都是由这四部分组成的,缺少任何一部分都不是完整的MPI程序。


MPI程序的头文件和相关变量的声明部分
include 'mpif.h'
character * (MPI_MAX_PROCESSOR_NAME) processor_name
integer myid, numprocs, namelen, rc,ierr

在FORTRAN 77中的头文件说明
声明了用来记录处理器名字的变量processor_name,
声明了用来记录当前处理器编号的变量myid,处理器总数的变量numprocs,处理器名字长度的变量namelen,用来记录返回结果和错误代码的rc和ierr。
#include "mpi.h"
int myid, numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];

在C语言中对应的头文件和变量声明形式
注意对于实现相同的功能,用C或者FORTRAN都可以实现,但是具体的实现方式是不同的,必须注意这两种语言在语法上的区别。

MPI程序的初始化和结束
在FORTRAN中MPI的初始化和结束语句分别是
call MPI_INIT( ierr )
call MPI_FINALIZE(rc)

它们分别是MPI程序的第一条和最后一条可执行程序。
在C中MPI的初始化和结束语句分别是
MPI_Init(&argc,&argv);
MPI_Finalize();

注意
MPI程序的开始和结束语句分别是MPI_INIT 和MPI_FINALIZE,否则会产生不可预期的后果。

MPI程序的执行部分
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
write(*,10) myid,numprocs,processor_name
10 FORMAT('Hello World! Process ',I2,' of ',I1,' on ', 20A)

在本例中,MPI程序一共有四条可执行语句,其中前三条是得到相应的输出变量,最后一条是输出语句,它将前面得到的变量的结果输出。
其中前3条语句分别得到当前进程编号,总共的进行数以及当前进程所在的处理器的名字。最后一条是输出语句,将这些结果输出到屏幕上。
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,"Hello World! Process %d of %d on %s\n",
myid, numprocs, processor_name);

这是相应的C程序中的语句