mpi4py 点到点通信

在上一篇中我们已经通过几个简单的例子展示了使用 mpi4py 进行 Python 的并行编程方法,大家可以看到使用 mpi4py 进行 MPI 并行编程是比较简单和方便的,但是要用好 mpi4py,写出实用的功能强大的 MPI 并行计算程序,我们还需要对 mpi4py 所提供对各种方法及其用法有更深入的了解。下面我们从最基本的点到点通信开始,详细地介绍 mpi4py 的各个有用的通信方法,并给出其使用方法的程序代码。

点到点通信要求必须有 send 和 recv 配对。比如说,如果多个发送进程向同一个目标进程连续发送两个消息,这两个消息都能与接收端的同一个 recv 匹配,则接收的顺序必须与发送的顺序一致。如果接收端进程同时也发起了两个连续的 recv,都与同一个消息匹配,且第一个 recv 仍在等待的状态下,第二个 recv 不能先于第一个操作收取第二个与其匹配的消息。消息传递中的 tag 具有决定性作用,如果进程使用的是单线程,且没有在接收消息操作中使用通配符(即 MPI.ANY_SOURCE)作为 tag,则发送的顺序与接收顺序严格匹配。

点到点通信共有12对,分别对应阻塞通信方式1组(4个)和非阻塞通信方式2组(分别为非重复的非阻塞和可重复的非阻塞),其中有一些还分为以小写字母开头的方法和以大写字母开头的方法,前者适用与可以被 pickle 系列化的任何 Python 对象,而后者对数组类型的数据通信更为高效。详细的分类见下表:

mpi4py 点到点通信_第1张图片
点到点通信分类

可以看出这些发送函数都遵循一定的命名规范:??[S/s]end,其中 B/b 表示缓存模式(Buffer),R/r 表示就绪模式(Ready),S/s 表示同步方式(Synchonous),I/i 表示立即发送,即非阻塞方式发送(Imediately)。不带任何前缀修饰的 Send/send 称为标准模式。I/i 可分别与 B/b,R/r,S/s 组合,得出如上表所示的各种通信模式。

消息通信的数据传递流程如下:

  1. 发送端调用发送函数;
  2. MPI 环境从发送缓冲区提取需要发送的数据,据此组装发送消息;
  3. 将组装的消息发送给目标;
  4. 接收端收取可匹配的消息,并将其解析到接收缓冲区。

以上概要地介绍了 mpi4py 中的点到点通信方法及其消息传递的流程,在后面我们将依次介绍四种阻塞通信模式并给出相应的程序实例。下一篇中我们从标准的阻塞通信模式开始。

你可能感兴趣的:(mpi4py 点到点通信)