在上一篇中我们介绍了 mpi4py 中组合发送接收通信方法,至此我们就对 mpi4py 中提供的各种点到点通信方法都做了一个简略的介绍,并给出了简短的使用例程。下面我们对点到点通信做一个小结。
通过前面的介绍可知,点到点通信有各种不同的模式,可分为阻塞通信,非重复非阻塞通信,可重复非阻塞通信,其中每一类还可分为标准、缓冲、就绪和同步模式。要理解各种模式通信的行为,关键是弄清楚各个模式对缓冲使用的方式。简言之,各个模式使用缓冲的特点可总结为:标准的 Send 实际利用了 MPI 环境提供的默认缓冲区;缓冲的 Bsend 实际相当于将 MPI 环境提供的缓冲区放在用户空间管理;就绪的 Rsend 实际相当于不要缓冲区,但发送端不能提前等待;同步的 Ssend 实际也相当于不要缓冲区,但允许等待。异步方式下各个模式工作原理也类似,只不过可将其理解为 MPI 环境会另起一个线程在后台做实际的消息传输,通过 MPI_Wait*,MPI_Test* 等机制与 MPI 进程的主线程进行通信和同步。
点到点通信特别需要注意的一件事就是预防死锁,导致死锁的原因有很多,其中最典型的是缓冲区争夺导致的死锁,比如下面这个例子:
# Send_Recv_small.py
import