【並行計算】點對點通信(Point to Point Communication)
1.簡單介紹
在進行並行計算時,各個進程之間並不一定是完全獨立的,當然有的時候確實是完全獨立的。但是還有很多時候,比如大規模計算,我們可能把計算任務拆分給各個進程,因此還要進行合併,比如對一萬個數進行求和運算,如果每個進程先算兩個數的和,然後再和其他進程的結果加起來,這樣就需要通信。
本文主要介紹的是最基本的點對點通信(Point to Point),在並行計算中非常常用。
2.Talking is Cheap, Show me the Code!
將下面的代碼保存爲exp_comm_p2p.py
:
# point to point communication
# using 2 process to show
from mpi4py import MPI
import numpy as np
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
tr_buff = np.zeros(1) # to store data to transfer or receive
if rank == 0:
tr_buff[0] = 1
print('Process %d: I\'ll send number %d to Process 1' % (rank, tr_buff[0]))
comm.Send(tr_buff, dest=1)
if rank == 1:
comm.Recv(tr_buff, source=0)
print('Process %d: I\'ve received %d from Process 0' % (rank, tr_buff[0]))
3.代碼部分介紹
在點對點通信中,最重要的兩行代碼就是發送和接收的MPI.COMM_WORLD.Send()
和MPI.COMM_WORLD.Recv()
,發送函數的dest參數指的是要發送到的進程號,接收函數的source參數指的是信息源的進程號。
其第一個參數一般指發送和接受的緩衝區,可以用數組、列表等。
comm.Send(tr_buff, dest=1)
comm.Recv(tr_buff, source=0)
4.執行效果
我們在命令行中執行: mpiexec -n 2 python exp_comm_p2p.py
,可以看到輸出如下:
(base) C:\Users\44375\Documents\python_proj>mpiexec -n 2 python exp_comm_p2p.py
Process 0: I'll send number 1 to Process 1
Process 1: I've received 1 from Process 0