Hello from process 3
Данный порядок обусловлен тем, что нулевой процесс принимает сообщения в порядке очередности их поступления от других процессов. Такой «плавающий» вид получаемых результатов существенным образом усложняет разработку, тестирование и отладку параллельных программ, т.к. в этом случае исчезает один из основных принципов программирования – повторяемость выполняемых вычислительных экспериментов. Как правило, если это не приводит к потере эффективности, следует обеспечивать однозначность расчетов и при использовании параллельных вычислений. Так, для рассматриваемого простого примера можно восстановить постоянство получаемых результатов при помощи задания ранга процесса-отправителя в операции приема сообщения:
MPI_Recv (&RecvRank, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &Status).
Указание (в четвертом параметре функции) циклически изменяющегося ранга процесса-отправителя задает порядок приема сообщений, и, как результат, строки печати будут появляться строго в порядке возрастания рангов процессов. Однако в тех случаях, когда сообщение от процесса с более низким рангом приходит, в силу технических причин, позже, чем сообщение от процесс с более высоким рангом, возможно замедление выполнения программы.
Следует отметить еще один важный момент – разрабатываемая с использованием MPI программа как в данном примере, так и в общем случае используется для порождения всех процессов параллельной программы. Следовательно, программа должна содержать в себе все действия, которые должны выполняться запускаемыми процессами. Можно сказать, что MPI-программа представляет собой единый программный код, различные части которого используются разными процессами. Так, в приведенном примере участок кода в первом блоке if выполняется только процессом с рангом 0, участок кода внутри второго блока if выполняется всеми процессами, за исключением процесса с рангом 0.
Наличие в одной и той же программе фрагментов кода разных процессов также значительно усложняет понимание и, в целом, разработку MPI-программы. Как результат, можно рекомендовать при увеличении объема разрабатываемых программ выносить программный код разных процессов в отдельные программные модули (функции). Общая схема MPI-программы в этом случае будет иметь вид:
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
if ( ProcRank == 0 ) DoProcess0();
else if ( ProcRank == 1 ) DoProcess1();
else if ( ProcRank == 2 ) DoProcess2();
Во многих случаях, как и в рассмотренном примере, выполняемые действия являются отличающимися только для процесса с рангом 0. В этом случае общая схема MPI-программы принимает более простой вид:
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
if ( ProcRank == 0 ) DoProcess0();
Дата добавления: 2016-02-02; просмотров: 672;