В моей программе я хочу, чтобы только цикл for был запущен параллельно. Остальная часть кода должна запускаться последовательно. Несмотря на то, что это не может быть лучшим способом, я хочу использовать подход, описанный здесь (см ответа на Крисе):Как смешивать последовательный и параллельный код с использованием MPI
Короче говоря, я позволяю ранг 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?
Может быть OpenMP лучше всего подходит для вашей проблемы. Вы работаете или ожидаете запустить свою программу на нескольких вычислительных узлах одновременно? –
Как вы написали свой псевдокод, все защищено первым оператором 'if (comm.rank() == 0)', поэтому все остальные процессы будут игнорироваться. Поэтому я не уверен, какова желаемая структура кода. Может быть, вам нужна последовательность серийно-параллельных серий, а не пытаться вставить параллельный блок внутри последовательного блока? Или, может быть, вы хотите что-то еще? –
@HristoIliev Причина, по которой я не использовал OpenMP, был вызван проблемами с глобальными переменными. Но я должен сказать, что я не эксперт в OpenMP и MPI. – beginneR