next up previous contents
Next: Установка соединения Up: Интерфейс менеджера процессов Previous: Зарезервированные ключи info   Contents

Пример менеджер-рабочий с использованием MPI_SPAWN

/* менеджер */
#include ``MPI.h''
int main(int argc, char **argv)
$\lbrace$
int world_size, universe_size, *universe_sizep, flag;
MPI_Comm everyone; /* интеркоммуникатор */
char worker_program100;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);

if (world_size != 1)
error("Top heavy with management");

MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE,
&universe_sizep, &flag);

if (!flag) $\lbrace$
printf(``This MPI does not support UNIVERSE_SIZE.'');
printf(``How many processes total? '');
scanf(``%d'', &universe_size);
$\rbrace$ else
universe_size = *universe_sizep;
if (universe_size == 1)
error(``No room to start workers'');

/*
* Теперь порождаем рабочих. Отметьте, что тип порождаемого рабочего
* определяется во время выполнения, и очевидно эти вычисления должны
* проводиться во время выполнения и не могут быть выполнены перед
* запуском программы.. Если что либо и известно при первом запуске
* программы, всегда лучше запустить все сразу в едином
* MPI_COMM_WORLD.
*/

choose_worker_program(worker_program);
MPI_Comm_spawn(worker_program, MPI_ARGV_NULL, universe_size-l,
MPI_INFO_NULL, 0, MPI_COMM_SELF, &everyone,
MPI_ERRCODES_IGNORE);

/*
* Здесь находится параллельный код. Коммуникатор ``everyone'' может
* использоваться для связи с порожденными процессами, которые имеют ранги
* 0,...,MPI_UNIVERSE_SIZE-1 в удаленной группе интеркоммуникатора
* ``everyone''. MPI_Bcast, использующий этот коммуникатор, будет
* посылать широковещательные сообщения всем рабочим непосредственно.
*/

MPI_Finalize();
return 0;
$\rbrace$

/* рабочий */

#include ``MPI.h''
int main(int argc, char **argv)
$\lbrace$
int size;
MPI_Comm parent;
MPI_Init(&argc, &argv);
MPI_Comm_get_parent(&parent);
if (parent == MPI_COMM_NULL) error(``No parent!'');
MPI_Comm_remote_size(parent, &size);
if (size != 1) error(``Something's wrong with the parent'');

/*
* Здесь находится параллельный код. Менеджер представлен процессом с рангом0
* в (удаленной группе) MPI_COMM_PARENT. Если рабочим необходимо общаться
* между собой, они могут использовать MPI_COMM_WORLD.
*/

MPI_Finalize();
return 0;
$\rbrace$



Alex Otwagin 2002-12-10