如何解决据我所知,缓冲模式 MPI 不起作用
我有多个生产者和一个消费者进程。每个进程都由 MPIPoolExecutor
类启动。首先我启动消费者进程,然后使用 starmap
方法开始启动生产者进程。消费者接受接收数据并将其保存到硬盘驱动器。每个生产者进程都会创建一个与需要发送的数据大小相同的缓冲区,并使用阻塞方法 bsend
发送它。我期望每个生产者进程将数据转储到缓冲区中并退出。但是,我注意到一个延迟,看起来每个生产者进程都在等待消费者进程使用数据。我错过了什么?我的代码是这样的:
def consumer(args...):
comm = MPI.COMM_WORLD
file = tb.open_file(file_name,'w')
filters = tb.Filters(complevel=5,complib='blosc')
array = file.create_carray(file.root,'data',tb.Float32Atom(),shape=(n_,n_),filters=filters)
for i in range(num_tasks):
t = time.time()
idxs,data = MPI.Comm.recv()
print("time for waiting --consumer ",time.time() - t)
array[idxs,:] = data
def producer(args...):
comm = MPI.COMM_WORLD
#adding 1000 just to be in the safe side.
mem = MPI.Alloc_mem(data.nbytes + idxs.nbytes + 1000)
MPI.Attach_buffer(mem)
#Since consumer is launched first,it guarantees to get a rank of 1.
MPI.Comm.bsend([idxs,data],1)
MPI.Detach_buffer()
....
with MPIPoolExecutor() as executor:
executor.starmap(consumer,[(args)])
executor.starmap(produces,list_of_args)
解决方法
如果消费者首先启动,它的等级为零,而不是 1。另外:您误解了缓冲通信。如果您希望生产者返回,请使用 MPI_Isend
。缓冲区分离调用会阻塞,直到其中的所有消息都已完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。