用FORTRAN 77+MPI 实现的"HELLO WORLD"
program main
include 'mpif.h'
character * (MPI_MAX_PROCESSOR_NAME) processor_name
integer myid, numprocs, namelen, rc,ierr
call MPI_INIT( ierr )
C 程序初始化
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr
)
C 得到当前进程号
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr
)
C得到总的进程数
call MPI_GET_PROCESSOR_NAME(processor_name, namelen,
ierr)
C得到处理器名字
write(*,10) myid,numprocs,processor_name
10 FORMAT('Hello World! Process ',I2,' of ',I1,' on ', 20A)
call MPI_FINALIZE(rc)
C结束
end
输出结果
Hello World! Process 1 of 4 on tp5
Hello World! Process 0 of 4 on tp5
Hello World! Process 2 of 4 on tp5
Hello World! Process 3 of 4 on tp5
讲解:
第一部分,首先要有MPI相对于FORTRAN实现的头文件mpif.h,对于MPI相对于C语言的实现,其头文件是不同的。即用FORTRAN语言编写的MPI并行程序,必须有MPI的FORTRAN头文件mpif.h。
第二部分,定义程序中所需要的与MPI有关的变量。MPI_MAX_PROCESSOR_NAME是MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度,机器名放在变量processor_name中;整型变量myid和numprocs分别用来记录某一个并行执行的进程的标识和所有参加计算的进程的个数;namelen是实际得到的机器名字的长度;rc和ierr分别用来得到MPI过程调用结束后的返回结果和可能的出错信息。
第三部分,MPI程序的开始和结束必须是MPI_INIT和MPI_FINALIZE,分别完成MPI程序的初始化和结束工作。
第四部分,MPI程序的程序体,包括各种MPI过程调用语句和FORTRAN语句。MPI_COMM_RANK得到当前正在运行的进程的标识号,放在myid中;MPI_COMM_SIZE得到所有参加运算的进程的个数,放在numprocs中;MPI_GET_PROCESSOR_NAME得到运行本进程的机器的名称,结果放在processor_name中,它是一个字符串,而该字符串的长度放在namelen中;write语句是普通的FORTRAN语句,它将本进程的标识号,并行执行的进程的个数,运行当前进程的机器的名字打印出来,和一般的FORTRAN程序不同的是这些程序体中的执行语句是并行执行的,每一个进程都要执行。不妨指定本程序启动时共产生4个进程同时运行,而运行本程序的机器的机器名为"tp5",4个进程都在tp5上运行,其标识分别为0,1,2,3,执行结果如图所示,虽然这一MPI程序本身只有一条打印语句,但是由于它启动了四个进程同时执行,每个进程都执行打印操作,故而最终的执行结果有四条打印语句。
|