Вычислительный центр им. А.А. Дородницына РАН
Раздел виртуального курса Параллельное программирование в интерфейсе MPI
|
|
Лабораторная работа ╧ 2: основы MPI попарного обмена сообщениями I
Содержание
Предварительные требования
Работу следует делать после изучения
MPI основы попарного обмена сообщениями I.
Вам следует вначале полностью завершить упражнения лабораторной работы по
основам MPI
прежде чем приступать к этой работе.
Чтобы изучать или найти ссылки по синтаксису вызовов MPI, получите доступ к
стандарту передачи сообщений из
http://www-unix.mcs.anl.gov/mpi/ или из
руководства программиста Межведомственного суперкомпьютерного центра (.zip ) Word
Цели
Настоящая лабораторная работа, во-первых, познакомит вас с использованием блокирующих и неблокирующих вызовов.
Затем вы будете работать на простом коде, чтобы улучшить образцы декомпозиции и коммуникации данных.
Упражнение 1
Рабочий файл на C: deadlock.c
Файл решения на C: fixed.c
Это упражнение демонстрирует, что неблокирующие функции безопасее блокирующих функций.
- Скомпилируйте эту тупиковую программу (deadlock). Например, для mpich в Unix, следует использовать команду:
mpicc -o deadlock deadlock.c .
Назначив для использования два узла и максимальное время исполнения 5 минут, запустите программу:
mpirun -np 2 deadlock -maxtime 5 .
Программа выдаст несколько строк выходных данных и затем встанет.
Чтобы не ждать 5 минут до выброса по предельному времени счета, вам следует
завершить запущенную задачу командой вида
mkill deadlock.1,
где deadlock -- имя задачи, а 1 -- ее номер.
- Прочитайте всю тупиковую программу (deadlock). Понимаете ли вы, почему она попадает в тупик?
- Откорректируйте тупиковую программу так, чтобы она могла работать до нормального завершения,
с помощью замены блокирующего вызова на неблокирующий.
Упражнение 2
Рабочие файлы для C: least-squares-pt2pt.c, xydata
Это упражнение было разработано, чтобы представить вам множество возможностей по параллельному программированию,
особенно в областях попарной коммуникации и декомпозиции данных.
Вы можете начать с программы least-squares-pt2pt.c и проделать каждую из нижеследующих задач
независимо.
Альтернативно, вы можете начать с программы least-squares-pt2pt.c и постепенно, шаг за шагом,
создать программу, которая содержит решение всех задач.
- Прочитайте внимательно всю программу и попытайтесь хорошо разобраться в ее алгоритме.
Посмотрите на использование блокирующих вызовов для отправок и получений и на то, как данные декомпозируются.
Есть в наличии также последовательная версия этой программы least-squares.c.
Из-за способа, каким параллельное окружение управляет сигналом, стандартную функцию sleep() нельзя
использовать. Поэтому, вызывается функция new_sleep, содержащаяся в файле new_sleep.c.
- Откомпилировать программу.
- cc -c new_sleep.c
- mpicc least-squares-pt2pt.c new_sleep.o -o least-squares-pt2pt.exe
- Запустите программу least-squares-pt2pt.exe с различным числом процессов (от 2 до 10).
Обратите внимание, как экземпляры данных распределяются по процессам.
Заметим, что: Все нижеследующие программы должны быть откомпилированы
тем же способом, как программа "least-squares-pt2pt.exe", тем не менее, объектный код "new_sleep.o"
следует создавать только однажды.
- Чтобы попрактиковаться в использовании неблокирующих отправки и получения,
замените блокирующие вызовы отправки и получения в least-squares-pt2pt.c
на неблокирующие вызовы.
Файл решения на С запишите в: pt2pt-nblk-comm.c
- Программа нуждается в некотором улучшении при работе с балансированием загрузки.
Это так, так как последнему процессу дается наибольшое число экземпляров данных, когда их
не распределяют поровну по числу процессов.
Перепишите шаги 2 и 3 программы least-squares-pt2pt.c, чтобы обеспечить наиболее равномерное
распределение экземпляров данных по процессам.
Когда существуют избыточные данные, некоторые процессы должны иметь n/numprocs,
а некоторые иметь (n/numprocs) + 1 экземпляров данных.
(Заметим: Предполагается целое деление для n/numprocs.)
Файл решения на С запишите в: pt2pt-data-decomp.c
- На шаге 4 программы f least-squares-pt2pt.c процесс 0 получает все частные сумммы
от других процессов. Перепишите шаг 4 используя двоичное дерево
как описано ниже:
Файл решения на С запишите в: pt2pt-bi-reduc.c
- Как возможное (но необязательное) упражнение,
скомбинируйте все зафиксированное в одну программу.
Файл решения на С запишите в: pt2pt-combo.c