【并行计算】点对点通信(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