2015-10-21 3 views
1

В моей программе я хочу, чтобы только цикл for был запущен параллельно. Остальная часть кода должна запускаться последовательно. Несмотря на то, что это не может быть лучшим способом, я хочу использовать подход, описанный здесь (см ответа на Крисе):Как смешивать последовательный и параллельный код с использованием MPI

link

Короче говоря, я позволяю ранг 0 сделать серийную часть.

Теперь проблема в том, что у меня есть несколько циклов, включая цикл while. Структура выглядит следующим образом:

# serial part 
# start of while loop { 
    # parallel part 
# end of while loop 
# end of serial part 

код strukture выглядит следующим образом:

boost::mpi::environment env; 
boost::mpi::communicator comm; 

if(comm.rank()==0) 
{ 

while(...) 
{ 

} // !!!! end the if loop here? 

// start parallel for loop here 
for(....){} 


// continue serial part 
if(comm.rank()==0) 
{ 
//... 

} // end of while loop 
} // end of if loop 

ли право закрыть серийную часть (если-цикл), непосредственно после того, как была открыта в то время как петля?
И, во-вторых, как я могу сказать другим рядам ждать окончания ранга 0?

+2

Может быть OpenMP лучше всего подходит для вашей проблемы. Вы работаете или ожидаете запустить свою программу на нескольких вычислительных узлах одновременно? –

+1

Как вы написали свой псевдокод, все защищено первым оператором 'if (comm.rank() == 0)', поэтому все остальные процессы будут игнорироваться. Поэтому я не уверен, какова желаемая структура кода. Может быть, вам нужна последовательность серийно-параллельных серий, а не пытаться вставить параллельный блок внутри последовательного блока? Или, может быть, вы хотите что-то еще? –

+0

@HristoIliev Причина, по которой я не использовал OpenMP, был вызван проблемами с глобальными переменными. Но я должен сказать, что я не эксперт в OpenMP и MPI. – beginneR

ответ

1

Это:

# serial part 
# start of while loop 
    # parallel part 
# end of while loop 
# end of serial part 

не работает, как MPI. В программе MPI нет последовательных или параллельных областей.

При запуске программы MPI, используя mpiexec или mpirun, запускает флот фиксированного числа * одинаковых * последовательных программ, которые могут общаться между собой, время от времени с использованием вызовов в библиотеку MPI. Выполнение этих отдельных серийных программ изначально отличается только * в своем ранге, и каждый должен принимать решения о том, как работать на основе этого. Каждый процесс, выполняющий одну из этих последовательных программ, видит только свои собственные переменные, и работа должна быть выполнена - в виде вызовов функций MPI - для передачи этих значений между различными процессами.


* обычно

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