MPI 2.0: Динамическое управление процессами

В MPI 1.1 как такового управления процессами нет: параллельная программа состоит из заранее определенного числа процессов, причем число процессов не может меняться в процессе работы программы и новые процессы не могут подключаться к уже существующим. Этого не всегда бывает достаточно. Поэтому, в MPI 2.0 появились средства, позволяющие следующее:

Динамическое порождение новых процессов

Установка соединения между уже исполняющимися процессами

Динамическое порождение новых процессов

int MPI_Comm_spawn(char *command, char *argv[], int maxprocs, MPI_Info info,

int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[])

command — имя исполняемого файла (значим только в процессе с рангом root)

argv — массив аргументов (последний должен быть NULL)

maxprocs — максимальное число порождаемых процессов

(число фактически порожденных процессов может быть меньше )

info — Множество пар «ключ-значение», определяющее,

каким образом запускать новые процессы

root — ранг корневого процесса.

comm — исходный коммуникатор

intercomm — адрес, по которому создается интеркоммуникатор между исходными и вновь порожденными процессами.

array_of_errcodes — массив кодов ошибок вновь создаваемых процессов.

Для порождения процессов запуском разных исполняемых файлов либо запуском одного и того же файла с разными аргументами используется функция MPI_Comm_spawn_multiple

int MPI_Comm_spawn_multiple(int count, char *array_of_commands[],

char **array_of_argv[], int array_of_maxprocs[],

MPI_Info array_of_info[], int root, MPI_Comm comm,

MPI_Comm *intercomm, int array_of_errcodes[])

count — размер массива array_of_commands.

array_of_commands — массив имен исполняемых файлов

array_of_argv — массив наборов аргументов командной строки для каждого исполняемого файла

array_of_maxprocs — массив максимальных количеств порожденных процессов

для каждого элемента array_of_commands

root — ранг процесса, порождающего новые процессы

comm — исходный коммуникатор

intercomm — адрес интеркоммуникатора между группами исходных и вновь порожденных процессов

array_of_errcodes — массив кодов ошибок вновь создаваемых процессов.

В каждом из порожденных процессов создается коммуникатор MPI_COMM_WORLD, который объединяет только вновь порожденные процессы.Для того, чтобы вновь созданные процессы имели возможность общаться с уже существующими, используется следующая функция:

int MPI_Comm_get_parent(MPI_Comm *parent)

parent — адрес, по которому записывается интеркоммуникатор между группами новых

и ранее существовавших процессов. В случае ошибки по этому адресу записывается

MPI_COMM_NULL

Пример 1

Есть два исполняемых файла manager и worker. manager при запуске порождает 5 процессов worker Ниже следуют исходные коды

manager.c

#include <mpi.h>

int main(int argc, char** argv)

{

int world_size, universe_size, *universe_sizep, flag;

MPI_Comm everyone; /* intercommunicator */

char worker_program[100]="./worker";

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &world_size);

universe_size=6;

MPI_Comm_spawn(worker_program, MPI_ARGV_NULL, universe_size-1,

MPI_INFO_NULL, 0, MPI_COMM_SELF, &everyone,

MPI_ERRCODES_IGNORE);

MPI_Finalize();

return 0;

}

worker.c

#include <mpi.h>

#include <stdio.h>

int main(int argc, char *argv[])

{

int parentsize,rank,size;

MPI_Comm parent;

MPI_Init(&argc, &argv);

MPI_Comm_get_parent(&parent);

MPI_Comm_remote_size(parent, &parentsize);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

printf("Hello, world! I am worker %d of %d \n",rank,size);

MPI_Finalize();

return 0;

}

mpicc manager.c -o manager

mpicc worker.c -o worker

mpiexec -n 1 ./manager

Hello, world! I am worker 3 of 5

Hello, world! I am worker 0 of 5

Hello, world! I am worker 2 of 5

Hello, world! I am worker 1 of 5

Hello, world! I am worker 4 of 5

Задание 9

Написать программу, которая принимает на вход число процессов, запускает одну из лабораторных работ (1,2,3,6,7), получает от нее результат и выводит.

Задание 10

Написать программу расчета площади круга методом Монте-Карло.

Задание 11

Выполнить экспериментальную оценку ускорения системы и вычислить часть параллельных инструкций по закону Амдала.

ОСНОВНАЯ РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА

1. А.П.Ершов. Вычислимость в произвольных областях и базисах. Семиотика и информатика, вып.19, стр.3-58, 1982.

2. А.И.Мальцев. Алгоритмы и рекурсивные функции, Наука, 1986.

3. Х.Роджерс. Теория рекурсивных функций и эффективная вычислимость. Мир, Москва, 1972. (Hartley Rogers. Jr, Theory

of Recursive Functions and Effective Computability, Mc Graw -Hill, 1967).

4. В.А.Успенский, А.Л.Семенов. Теория алгоритмов: основные открытия и приложения, Наука, 1987, 288 стр.

5. В.А.Вальковский, В.Э.Малышкин. Синтез параллельных программ и систем на вычислительных моделях. - Наука,

Сибирское отделение, 1988, 128 стр.

6. В.Котов. Сети Петри. Наука, 1990.

7. С.М.Ачасова, О.Л.Бандман. Корректность параллельных вычислительных процессов. Наука, 1990.

8. Дж. Питерсон. Теория сетей Петри и моделирование систем. Мир, 1984 (J.Peterson. Petri Net Theory and the Modeling of Systems. Prentice-Hall, inc. 1981).

9. Ч.Хоар. Взаимодействующие последовательные процессы, Мир, 1989, 264 стр.

10.В.Анисимов. Программирование распределенных вычислительных систем. Под редакцией В.Е.Котова. Системная информатика, выпуск 3, Наука, 1993, стр. 210-247.

11.В.Н.Сачков. Комбинаторные методы дискретной математики, Наука, 1977, 317 стр.

12.Х.Пападимитриу, К.Стайглиц. Комбинаторная оптимизация. Алгоритмы и сложность. Москва, Мир, 1985

13.М.Гэри, Д.Джонсон. Вычислительные машины и труднорешаемые задачи. – М., Мир, 1982, - 416 с.

14.Ю.А.Березин, В.А.Вшивков. Метод частиц в разреженной плазме. Наука, Новосибирск. 1980.

15.Корнеев В.В, Киселев А. Современные микропроцессоры, 3-е издание. Санк-Петербург, БХВ-Петербург. 2003.- 440 c. 423

16. Таненбаум Э. Архитектура компьютеров. СПб.:Питер, 2002. -704с.

17. Корнеев В.В. Параллельные вычислительные системы. М.: Москва, 1999.- 312 c.

18. Цилькер Б. Я., Орлов С.А. Организация ЭВМ и сетей. СПб.: Питер, 2004. 668 с.

19. Пятьсот самых мощных компьютеров мира [http://www.top500.org].

20.В.Д.Корнеев. Параллельное программирование в MPI. – Новосибирск, ИВМ и МГ СО РАН, 2002г., 215 стр..

21.www.openmp.org

22. В.В.Воеводин, Вл.В. Воеводин. Параллельные вычисления. БХВ – Петербург2002. – 609с.

23. Г.Р.Эндрюс. Основы многопоточного параллельного и распределенного программирования. –М.: Изд. Дом Вильямс,

Учебное издание

Константин Валентинович Нефедев

Наши рекомендации