Я запускаю код MPI на Python, используя mpi4py, который выглядит примерно так:
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)
Я замечаю, что процесс root всегда занят (ЦП на 100%). Я предпочитаю, чтобы корневой процесс спал до тех пор, пока рабочий процесс не будет готов принять следующее сообщение. Какие шаблоны в программировании MPI способствуют такому поведению? Возможно, корневой процесс тоже должен работать?
Еще один недостаток этой схемы заключается в следующем... Если рабочий процесс 4 завершается раньше, чем 3, то 4 должен дождаться завершения 3, прежде чем получить новое сообщение от root, чтобы продолжить выполнение работы. Любые предложения о том, как спроектировать корневой процесс, который всегда пытается отправить следующее сообщение бездействующему процессу? Меня это в основном устраивает, потому что первый процесс, получивший сообщение, обычно завершается первым. Однако, если рабочая нагрузка изменяется для каждого сообщения, это не всегда так.
Спасибо, Кевин