У меня есть MPI-совместимый код выборки MCMC с поддержкой MPI, который запускает параллельные запросы правдоподобия на отдельные ядра. Поскольку это (обязательно - не спрашивать) выборка отбраковки, мне нужно только одно из примеров np, чтобы добиться успеха, чтобы начать следующую итерацию, и довольно успешно достигли ускорения ~ np x этим методом в прошлом.MPI: Как получить один процесс для завершения всех остальных - python -> fortran
Я применил это к новой проблеме, когда вероятность называет f2py-wrapped fortran подпрограммой. В этом случае на каждой итерации другие процессы np-1 ожидают, что самый медленный (иногда очень медленный) результат вернется, даже если один из этих np-1 уже является приемлемым.
Поэтому я подозреваю, что мне нужно передать сообщение всем процессам без выигрыша (в терминах скорости), чтобы завершить работу, чтобы начать следующую итерацию, и мне нужно выяснить некоторые детали наилучшего способа сделать это , как показано ниже.
Код python выглядит примерно так. Сэмплер - PyMultiNEST.
from mpi4py import MPI
world=MPI.COMM_WORLD
def myloglike(parameters,data,noise):
modelDataRealisation,status=call_fortran_sub(parameters)
if status == 0: # Model generated OK
winner=world.rank # This is the rank of the current winner
# I want to pass a message to the other still-running processes
# identifying that a successful sample has come back
won=world.bcast(winner,root=winner)
# I tried receiving the message here but the fortran_sub doesn't know
# anything about this - need to go deeper - see below
# Calculate chisq value etc.
loglike = f(data,modelDataRealisation,noise)
return loglike
Должно ли вещание проходить через мастер-процесс?
Теперь сложной частью является получение сигнала kill в коде F90. Предположительно, если код всегда слушает из (? В то время как петля) это будет замедлять много - но я должен все равно использовать что-то вроде:
call MPI_RECV(winner,1,MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE,MPI_ANY_TAG&
&,MPI_COMM_WORLD,0,0)
А потом, как лучше убить этот процесс после того, как сообщение было получено?
И, наконец, нужно ли что-нибудь сделать в коде F, чтобы сделать следующий перезапуск итерации ОК/порождать новые процессы?
Спасибо!
Большое спасибо - я: проверка каждые несколько итераций (штраф времени еще лучше, чем раньше); используя MPI_Irecv (мне нужно было тщательно устанавливать теги, чтобы избежать столкновений с другими тегами MPI); перебирать теги для проверки входящих сообщений; передавая массив np-элементов, а не одно целое. Благодаря! :) – jtlz2