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. Г.Р.Эндрюс. Основы многопоточного параллельного и распределенного программирования. –М.: Изд. Дом Вильямс,
Учебное издание
Константин Валентинович Нефедев