【发布时间】:2019-11-27 16:00:55
【问题描述】:
我正在为一个项目使用 MPI。我需要以非阻塞模式将一个包从一个节点传输到另一个节点。我正在用一个包含与我的通信逻辑相关的信息的类来组织这个包。
我正在使用函数 irecv() 进行一些测试,以获取我的通信请求和缓冲区以及 test() 以验证是否有消息到达。
MPI 缺少 Python 文档,因此我正在查看 source code 以获取更多信息,我正在使用的函数在哪里。
源代码声明irecv如下:
def irecv(self, buf=None, int source=ANY_SOURCE, int tag=ANY_TAG):
"""Nonblocking receive"""
cdef MPI_Comm comm = self.ob_mpi
cdef Request request = <Request>Request.__new__(Request)
request.ob_buf = PyMPI_irecv(buf, source, tag, comm, &request.ob_mpi)
return request
我知道,如果我想将数据放入缓冲区,我需要设置可选参数“buf”,并将接收到的消息存储在哪里。
我尝试了以下测试来了解它是如何工作的:
from mpi4py import MPI
import time
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
class Package(object):
msg = [[0,1,0,1,0,1],
[0,1,0,1,0,1],
[0,1,0,1,0,1],
[0,1,0,1,0,1],
[0,1,0,1,0,1]]
gotMessage = False
destination = -1
if rank == 0:
data = Package()
comm.isend(data, dest=1, tag=11)
elif rank == 1:
data = Package()
req = comm.irecv(buf=data, source=0, tag=11)
while not req.test():
sleep(0.1)
print(rank, data.msg)
我期待以下行为:
等级为 0 的节点将数据包作为对象发送到等级为 1 的节点
rank 1 的节点开始非阻塞接收,当它完成接收时,当
test()返回True时会发生什么,我可以打印data.msg。
问题是,当我运行buf时出现以下错误:
TypeError: 期望一个可写的缓冲区对象
如何正确使用irecv() 来传输/接收对象?
【问题讨论】: