用C+MPI 实现的"HELLO WORLD"
#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 %d of %d on %s\n",
myid, numprocs, processor_name);

MPI_Finalize();/*结束*/
}

在一台机器上执行的输出结果
Hello World! Process 0 of 4 on tp5
Hello World! Process 1 of 4 on tp5
Hello World! Process 3 of 4 on tp5
Hello World! Process 2 of 4 on tp5


在四台不同的机器上执行的输出结果
Hello World! Process 0 of 4 on tp5
Hello World! Process 1 of 4 on tp1
Hello World! Process 2 of 4 on tp3
Hello World! Process 3 of 4 on tp4

讲解:

第一部分,首先要有MPI相对于C实现的头文件mpi.h,而不是mpif.h,这和FORTRAN77是不同的。
第二部分,定义程序中所需要的与MPI有关的变量。MPI_MAX_PROCESSOR_NAME是MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度,机器名放在变量processor_name中,这和FORTRAN77中的没有区别;整型变量myid和numprocs分别用来记录某一个并行执行进程的标识和所有参加计算的进程的个数;namelen是实际得到的机器名字的长度。
第三部分,MPI程序的开始和结束必须是MPI_Init和MPI_Finalize,分别完成MPI程序的初始化和结束工作。对比FORTRAN77+MPI程序,这两个调用在FORTRAN77和C中所需要的参数是不同的,而且习惯上,在FORTRAN77中,所有的MPI调用均为大写(由于FORTRAN77源程序对大小写无关,因此使用小写的程序仍然是正确的,这里全用大写主要是遵守MPI书写FORTRAN77程序的惯例),而在C中则是以"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上运行,其标识分别为0,1,2,3,执行结果如图所示,虽然这一MPI程序本身只有一条打印语句,但是由于它启动了四个进程同时执行,每个进程都执行打印操作,故而最终的执行结果有四条打印语句。本程序的执行流程和上面的FORTRAN77+MPI的实现版本是一样的。
如果该程序在4台不同的机器tp1,tp3,tp4,tp5上执行,则其最终的执行结果将如图所示,即4个进程所运行的机器是不同的。由于4个进程同时执行,在本程序中没有限定打印语句的顺序,因此不管哪个进程的打印语句在前,哪个在后,都没有关系,只要有4条正确的输出语句即可。对比FORTRAN77+MPI和C+MPI程序的输出结果,不难发现不管是在一台机器上运行,还是在多台机器上运行,其最终执行输出结果是完全一样的。