第一个MPI程序
用C+MPI实现
#include"mpi.h"
#include<stdio.h>
#include<math.h>
void main(argc,argv)
int argc;
char *argv[];
{
int myid,numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_init(&argc,&argv);
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%dof%don%s\n",myid,numprocs,processor_name);
MPI_Finalize();
}
代码解析:
-
MPI_MAX_PROCESSOR_NAME是MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度机器名放在变量processor_name。整型变量myid和numprocs分别用来记录某一个并行执行进程的标识和所有参加计算的进程的个数,namelen是实际得到的机器名字的长度。
-
MPI程序的开始和结束必须是MPI_Init和MPI_Finalize分别完成MPI程序的初始化和结束工作
-
MPI程序的程序体包括各种MPI过程调用语句和C语句,MPI_Comm_rank得到当前正在运行的进程的标识号放在myid中,MPI_Comm_size得到所有参加运算的进程的个数放在numprocs中,MPI_Get_processor_name得到本进程运行的机器的名称结果放在processor_name中,它是一个字符串而该字符串的长度放在namelen中。
fprintf语句将本进程的标识号并行执行的进程的个数,本进程所运行的机器的名字,打印出来。和一般的C程序不同的是这些程序体中的执行语句是并行执行,的每一个进程都要执行,不妨指定本程序启动时共产生4个进程同时运行,而运行本程序的机器的机器名为tp5,4个进程都在tp5上运行,其标识分别为0123执行结果如图所示。虽然这一MPI程序本身只有一条打印语句,但是由于它启动了四个进程,同时执行每个进程都执行打印操作,故而最终的执行结果有四条打印语句。
由于MPI并行程序是在原来串行程序基础上的扩展,在许多地方和串行程序是相同的串行程序设计的,许多经验是可以应用到并行程序设计中的,但是同时我们必须注意在设计MPI程序的时候头脑中必须有程序并行执行的概念,而不是原来有序的串行执行,这才是串行和并行最主要的区别。