正文
rank
=
comm
.
Get_rank
()
size
=
comm
.
Get_size
()
if
rank
==
0
:
data
=
range
(
10
)
comm
.
send
(
data
,
dest
=
1
,
tag
=
11
)
print
(
"process {} send {}..."
.
format
(
rank
,
data
))
else
:
data
=
comm
.
recv
(
source
=
0
,
tag
=
11
)
print
(
"process {} recv {}..."
.
format
(
rank
,
data
))
执行效果:
zjshao@vaio:~/temp_codes/mpipy$ mpiexec -np 2 python temp.py
process 0 send [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...
process 1 recv [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...
非阻塞标准通信
所有的阻塞通信mpi都提供了一个非阻塞的版本,类似与我们编写异步程序不阻塞在耗时的IO上是一样的,MPI的非阻塞通信也不会阻塞消息的传递过程中,这样能够充分利用处理器资源提升整个程序的效率。
来张图看看阻塞通信与非阻塞通信的对比:
非阻塞通信的消息发送和接受:
同样的,我们也可以写一个上面例子的非阻塞版本。
from
mpi4py import MPI
import numpy as np
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
if rank == 0:
data = range(10)
comm.isend(data, dest=1, tag=11)
print("process {} immediate send {}...".format(rank, data))
else:
data = comm.recv(source=0, tag=11)
print("process {} recv {}...".format(rank, data))
执行结果,注意非阻塞发送也可以用阻塞接收来接收消息:
zjshao@vaio:~/temp_codes/mpipy$ mpiexec -np 2 python temp.py
process 0 immediate send [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...
process 1 recv [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...
支持Numpy数组
mpi4py的一个很好的特点就是他对Numpy数组有很好的支持,我们可以通过其提供的接口来直接传递数据对象,这种方式具有很高的效率,基本上和C/Fortran直接调用MPI接口差不多(方式和效果)
例如我想传递长度为10的int数组,MPI的C++接口是:
void Comm::Send(const void * buf, int count,