一、MPI 介绍
MPI 全名叫 Message Passing Interface,即信息传递接口,作用是可以通过 MPI 可以在不同进程间传递消息,从而可以并行地处理任务,即进行并行计算。需要注意的是,尽管我们偶尔会说使用 MPI 编写了某某可执行程序,但是 MPI 其实只是一个库,而不是一种语言,其可以被 Fortran、C、C++、Python 调用。
说到并行,为了避免在概念上混淆,那我们又不得不再提一下串行、并发、同步、异步这几个容易混淆的概念。
- 串行:指的是在执行多个任务时,各个任务按顺序执行,完成一个后才能进行下一个
- 并行:指的是多个任务可以同时执行
- 并发:并发编程又叫多线程编程,指的是在执行多个任务时,因为资源不够所以采用一个 CPU 轮换着进行这些任务,从而提高任务效率,因为切换任务的速度很快,所以看上去是多个任务一起进行
- 同步:同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。例如消息发送方必须等待消息接收方接受完才能继续执行后续任务
- 异步:异步就是彼此独立,在等待某件事的过程中继续做自己的事。例如消息发送方再发送完一条消息后不必等待接收方的接收即可继续执行后续任务
在开始 MPI 之前还需要再了解一下有关 MPI 的一些基本概念,从而帮助我们在宏观上理解 MPI 通信
首先是通信域(communicating domain),通信域定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称为 rank,进程间显性地通过指定 rank 作为标识来进行通信,一个进程 rank 可以指定另一个进程的 rank 以及独一无二的消息标签 tag 来发送消息。接收者也可以发送一个特定标签标记的消息的请求。类似于这样的涉及一个发送者以及一个接收者的通信被称为点对点(point-to-point)通信。
当然在很多情况下,某个进程可能需要跟其他所有进程进行通信,比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个点对点通信就显得很笨拙,而且这样会导致网络利用率很低。MPI 有专门的接口帮我们处理这里所有进程间的集体性(collective)通信
以上的概念目前先有个大概的理解即可,不需要特别深入,我们还是先步入正题,可以回过头来再学习这些概念
接下来我们以 Fortran 语言为例对 MPI 中常用的函数进行讲解,其他语言的函数功能与参数基本上与 Fortran 类似