2013-03-11 6 views
1

Мне нужно выполнить операцию, которая может быть выполнена только мастер-процессом. Рабы не могут ничего сделать, кроме как дождаться окончания мастера. Поэтому я сделал следующее (псевдокод, я обернуть большинство процедур, так что я бы трудное время придумывает с фактическим кодом MPI. Я надеюсь, что комментарии достаточно четко объяснять, что я делаю)Могу ли я использовать MPI_Bcast для синхронизации?

def routine(): 

    if not isMaster(): 
     # I am a slave. I just sit here, waiting for the master to finish. 
     # wait for a string from the master explaining the state 
     string = MPI_Bcast("whatever", 0) 
     return (string == "SUCCESS") 

    <master does its long running business> 

    string = MPI_Bcast("SUCCESS", 0) # tell the slaves it worked fine. 

    return True 

ли эта работа, или я неправильно использую трансляцию?

+0

Просто убедитесь, что корневой ранг в 'MPI_Bcast' соответствует тому, который используется в предикате' isMaster() '. –

ответ

2

Если вы сделаете это псевдокод:

def routine(): 

    if not isMaster(): 
     # I am a slave. I just sit here, waiting for the master to finish. 
     # wait for a string from the master explaining the state 
     string = MPI_Bcast("whatever", 0) 
     return (string == "SUCCESS") 

    else: 
     <master does its long running business> 
     string = MPI_Bcast("SUCCESS", 0) # tell the slaves it worked fine. 

    return True 

Тогда вы должны быть в порядке. (Разумеется, вам нужно убедиться, что вы используете конкретный API MPI для своего языка.) Обычно для трансляции или любой коллективной операции каждому рангу в коммуникаторе необходимо выполнить одинаковое количество вызовов. Для понимания может быть полезно реструктурировать программу таким образом, чтобы безоговорочно выполнять Bcast для каждого ранга в одной и той же строке исходного кода, например.

def routine(): 
    status_code = UNKNOWN 
    if isMaster(): 
     #do stuff 
     status_code = OK 

    MPI_Bcast(&status_code, 0) 
    #check status_code on each rank 
+0

Хорошо. Дело в том, что неважно, если мастер и подчиненный не попадают _the_same_call_ в MPI_Bcast. Они могут быть двумя разными вызовами, но это хорошая практика, что это одно и то же. Правильно ли я понимаю? –

+0

Да, это точно моя точка зрения. – Zulan

+0

Так как в конце кода не-мастер в OP есть инструкция 'return', я не вижу смысла добавлять' else: '. Реорганизованная версия действительно лучше. –

Смежные вопросы