【Fortran并行科学计算】Hello-World程序
MPI(message passing interface),是一个消息传递接口。MPI的函数总共有287个。
想实现一个MPI并行计算的程序的话,只要掌握MPI的工作机理和6个简单的MPI函数便可以了,本文介绍4个简单MPI函数:MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。
注意:以下调用格式为Fortran格式,大部分教程都是C语言的MPI介绍,这里以及以后的文章都是以Fortran为基础,尤其要注意Fortran不分大小写。
一、Hello World程序
先给出一个最简单的Hello_world的Fortran + MPI的程序,在此基础上来分析MPI的4个最简单的函数——MPI_INIT、MPI_COMM_RANK、MPI_COMM_SIZE和MPI_FINALIZE。
program hello_world
use mpi
!include 'mpif.h'
integer ierr, num_procs, my_id
call MPI_INIT ( ierr )
! find out my process ID, and how many processes were started.
call MPI_COMM_RANK (MPI_COMM_WORLD, my_id, ierr)
call MPI_COMM_SIZE (MPI_COMM_WORLD, num_procs, ierr)
print *, "Hello world! I'm process ", my_id, " out of ", num_procs, " processes."
call MPI_FINALIZE ( ierr )
stop
end program hello_world
1.MPI初始化函数
call MPI_INIT (ierr)
MPI_Init用来初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。
2.MPI结束函数
call MPI_FINALIZE(ierr)
MPI_Finalize则是结束MPI执行环境。
3.MPI进程标识获取函数
call MPI_COMM_RANK(MPI_COMM_WORLD, my_id, ierr)
MPI_Comm_rank就是来标识各个MPI进程的,告诉调用该函数的进程“我是谁?”。
4.MPI通信包含的进程数获取函数
call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr)
MPI_COMM_SIZE用来标识相应进程组中有多少个进程。
二、运行过程和结果
2.1. 将以上内容保存为hello_world.f90,上传到服务器的文件夹/home/xldeng/mpi里面:
2.2. 编译hello_world.f90为hello_world,并用ls查看内容:
mpiifort hello_world.f90 -o hello_world
2.3. 使用服务器里面的命令来调用不同的节点上面的核来计算:
srun -p hpib -n 10 hello-world
三、注意事项
3.1 . 注意程序中的一个小细节:
use mpi
!include 'mpif.h'
含义为调用mpi的库函数,因为使用的是Intel MPI + Fortran90,所以调用的方式为:use mpi。Fortran77可能需要 include “mpif.h”。
3.2 . 在2.2节中的mpiifort是ifort的并行使用方法,检验mpiifort的用法:which mpiifort或者是mpiifort -v。
3.3 . 在2.3节中的说明:本程序的运行平台为服务器上,所以使用的是MPI使用指南 | 武汉大学超算中心中提供的提交方法。如果在单台服务器上面,可以使用如下命令:
mpirun -np 4 hello_wolrd
来运行程序。