2015-03-10 4 views
0

У меня есть 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, чтобы сделать следующий перезапуск итерации ОК/порождать новые процессы?

Спасибо!

ответ

1

Что вы пытаетесь сделать, это не совсем учебник MPI, поэтому у меня нет ответа на учебник для вас. Похоже, вы не знаете, как долго будет «плохим» результатом.

Вы спрашиваете: «Предположительно, если код всегда выслушивает (в то время как цикл?), Он будет замедлять много», - но если вы используете неблокирующие отправки и получение, вы можете работать, например, 100 итерации, а затем проверить сообщение «прекратить работу».

Я бы избегал MPI_Bcast здесь, так как это не совсем то, что вы хотите. Побеждает один процесс. Затем этот процесс должен отправить «я выиграл!». сообщение всем остальным. Да, вы выполняете n-1 операции «точка-точка», которая будет головной болью, когда у вас есть миллион mpi-процессов.

С рабочей стороны MPI_Irecv с ANY_SOURCE будет соответствовать любым процессам «Я выиграл!». сообщение. Периодически проверяйте завершение.

+0

Большое спасибо - я: проверка каждые несколько итераций (штраф времени еще лучше, чем раньше); используя MPI_Irecv (мне нужно было тщательно устанавливать теги, чтобы избежать столкновений с другими тегами MPI); перебирать теги для проверки входящих сообщений; передавая массив np-элементов, а не одно целое. Благодаря! :) – jtlz2