在上一篇中我們介紹了 mpi4py 中就緒阻塞通信模式,下面我們將介紹同步阻塞通信模式汤踏。
在同步通信模式下织鲸,不論接收端是否啟動了接收動作溪胶,發(fā)送端都可在任何時候啟動發(fā)送動作,但發(fā)送端需等待接受端的接收動作發(fā)起并開始接收數(shù)據(jù)之后才可能結(jié)束盾饮,即發(fā)送動作的結(jié)束不僅意味著發(fā)送緩沖區(qū)已經(jīng)可以用于其它用途懒熙,而且還表示接收端也執(zhí)行了一定程度的接收工作。對阻塞的同步通信模式而言工扎,它實際上相當(dāng)于提供了一個同步通信的約束,即雙方進(jìn)程到達(dá)一個確定的同步點之后呈础,通信才可結(jié)束橱健。也可以說阻塞模式的同步發(fā)送動作不是一個“本地”動作,而是一個與遠(yuǎn)程接收進(jìn)程相連接的動作臼节。
同步通信的通信協(xié)議為:發(fā)送端首先向接受端發(fā)起一個請求發(fā)送消息的申請珊皿,接受端的 MPI 環(huán)境會將這個請求保存下來,然后待相應(yīng)的接收動作啟動后為其返回一個消息發(fā)送許可蟋定,發(fā)送端據(jù)此信息再執(zhí)行實際的消息發(fā)送。
下面是 mpi4py 中用于同步阻塞點到點通信的方法接口(MPI.Comm 類的方法):
ssend(self, obj, int dest, int tag=0)
recv(self, buf=None, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)
Ssend(self, buf, int dest, int tag=0)
Recv(self, buf, int source=ANY_SOURCE, int tag=ANY_TAG, Status status=None)
這些方法調(diào)用中的參數(shù)是與標(biāo)準(zhǔn)通信模式的方法調(diào)用參數(shù)一樣的扼仲。
下面分別給出 ssend/recv 和 Ssend/Recv 的使用例程屠凶。
# ssend_recv.py
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
send_obj = {'a': [1, 2.4, 'abc', -2.3+3.4J],
'b': {2, 3, 4}}
if rank == 0:
comm.ssend(send_obj, dest=1, tag=11)
print 'process %d sends %s' % (rank, send_obj)
elif rank == 1:
recv_obj = comm.recv(source=0, tag=11)
print 'process %d receives %s' % (rank, recv_obj)
運(yùn)行結(jié)果如下:
$ mpiexec -n 2 python ssend_recv.py
process 0 sends {'a': [1, 2.4, 'abc', (-2.3+3.4j)], 'b': set([2, 3, 4])}
process 1 receives {'a': [1, 2.4, 'abc', (-2.3+3.4j)], 'b': set([2, 3, 4])}
# Ssend_Recv.py
import numpy as np
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
count = 10
send_buf = np.arange(count, dtype='i')
recv_buf = np.empty(count, dtype='i')
if rank == 0:
comm.Ssend(send_buf, dest=1, tag=11)
print 'process %d sends %s' % (rank, send_buf)
elif rank == 1:
comm.Recv(recv_buf, source=0, tag=11)
print 'process %d receives %s' % (rank, recv_buf)
運(yùn)行結(jié)果如下:
$ mpiexec -n 2 python Ssend_Recv.py
process 0 sends [0 1 2 3 4 5 6 7 8 9]
process 1 receives [0 1 2 3 4 5 6 7 8 9]
上面我們介紹了 mpi4py 中同步阻塞通信模式蝇狼,在下一篇中我們將進(jìn)入到對非阻塞通信模式的介紹。