我正在使用 mpi4py 在 Python 中运行 MPI 代码,如下所示:
from mpi4py import MPI
import numpy as np
import os
comm = MPI.COMM_WORLD
rank = comm.Get_Rank()
size = comm.Get_Size()
if rank == 0:
res = np.zeros(2**16)
jobs = os.listdir('/my/data/dir')
for i in xrange(len(jobs)):
proc = (i % (size - 1)) + 1 #lacks load balancing
buf = load_buf_from_file(job[i])
#root waits here at 100%
comm.Send([buf, dtype], dest = proc) #lacks load balancing
comm.Recv([res, dtype], source = MPI.ANY_SOURCE)
save_result_to_file(res)
else:
buf = np.zeros(2**16)
comm.Recv([buf, dtype], source = 0)
res = do_lots_of_work(buf)
comm.Send([res, dtype], dest = 0)
我注意到根进程总是很忙(CPU 为 100%)。我更喜欢根进程休眠,直到工作进程准备好接收下一条消息。MPI 编程中有哪些促进这种行为的模式?也许根进程也应该工作?
这种设计的另一个缺陷如下......如果worker proc 4 在3 之前完成,那么4 必须等待3 完成,然后才能从root 获取新消息以继续工作。有关如何设计始终尝试将下一条消息发送到空闲进程的根进程的任何建议?这对我来说基本没问题,因为接收消息的第一个进程通常是第一个完成的进程。但是,如果每条消息的工作负载都发生变化,则情况并非总是如此。
谢谢,凯文