/* менеджер */
#include ``MPI.h''
int main(int argc, char **argv)
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)
printf(``This MPI does not support UNIVERSE_SIZE.'');
printf(``How many processes total? '');
scanf(``%d'', &universe_size);
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;
/* рабочий */
#include ``MPI.h''
int main(int argc, char **argv)
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;