- •Федеральное агенство связи Поволжская государственная академия телекоммуникаций и информатики
- •Введение
- •Реализация и настройка кластера интерфейса mpi в среде ms Windows 9x/nt/xp
- •Рекомендуемая литература
- •Лабораторная работа № 1 Компиляция программ, использующих интерфейс mpi
- •Подготовка к работе
- •Контрольные вопросы
- •3. Задание
- •4. Методические указания
- •4. Листинг программы
- •5. Примечания
- •Лабораторная работа № 2 Использование функции групповой рассылки данных
- •Подготовка к работе
- •Контрольные вопросы
- •3. Задание
- •4. Методические указания
- •5. Примечания
- •Лабораторная работа № 3 Вычисление числа π
- •Подготовка к работе
- •Контрольные вопросы
- •Задание
- •4. Методические указания
- •5. Пример выполнения
- •6. Примечания
- •Лабораторная работа № 4 Передача данных отдельным процессам
- •Задание
- •Методические указания
- •Алгоритм
- •Пример выполнения
- •Лабораторная работа № 5 Матричные вычисления
- •Контрольные вопросы
- •Приложение а
- •Приложение в Краткий справочник функций mpi
- •Сообщения «точка-точка»
- •Групповые сообщения
- •Типы пересылаемых данных
- •Аргументы
5. Примечания
Используйте функцию fflush(stdout) после вызова printf(). Иначе вы можете и не увидеть вывод на экран во время ввода и обработки данных, в противном случае увидите только после окончания работы программы. Это связано с тем, что текст, подаваемый на stdout – буферизуется, что приводит к тому, что вывод от удаленного хоста не приходит на консоль компьютера, с которой был осуществлен запуск. Функция fflush() принудительно сбрасывает буфер для stdout.
Иногда можно заметить, что ответ от удаленного хоста приходит со значительным опозданием, т.е. уже после прохождения цикла, во время ожидания ввода следующего числа. Это происходит, потому что функция MPI_Bcast() является буферной, т.е. после выполнения, управление программы сразу же передается следующему оператору, а передаваемое сообщение заносится в специальный буфер для передачи. В результате, мы можем сразу же после отработки MPI_Bcast() изменять содержимое буфера. Это позволяет рассылать сообщения и другим хостам или продолжать дальнейшую работу, не ожидая ответа удаленного хоста. Данные задержки могут быть связанны с загруженностью сети, или удаленного хоста. Чтобы программа ожидала окончания работы каждого узла – можно использовать синхронные функции передачи (с подтверждением). А можно, после рассылки всем процессам нужных данных, перед запуском параллельной обработки, использовать функцию MPI_Barrier(comm). Данная функция не возвращает управления, пока передачи между процессами не закончатся. Так же не стоит забывать, что передача данных происходит не только всем остальным хостам, но и хосту-отправителю. Поэтому функцию получения данных необходимо разместить и в блоке (обычно для ведущего хоста) откуда был вызван MPI_Bcast().
Лабораторная работа № 3 Вычисление числа π
Подготовка к работе
Необходимо иметь в наличие работающий кластер на базе MPICH. Уметь программировать на языке С. Ознакомиться со способом расчета числа π, приведенного в методических указаниях.
Контрольные вопросы
Может ли параллельная программа работать на гетеродинном класере?
Что такое гетеродинный кластер?
Чем отличается паралельная программа (с интерфейсом MPI) от обычной программы?
Опишите способ расчет числа π использованного в данной лабораторной работе.
Назначение функции MPI_Reduce.
Назначение функции MPI_Wtime.
Почему число периодов желательно задавать числу процессов?
Поясните ход программы по блок-схеме.
Задание
Написать программу для расчета числа π по указанной блок-схеме.
4. Методические указания
Распределение данных для расчетов и сбор результатов с помощью MPI. В качестве примера, будет взят расчет числа π с помощью разложения элементов ряда.
Число
π можно приближенно подсчитать с помощью
следующего интеграла:
.
Данный интеграл можно преобразовать в
ряд следующего вида:
,
или в общем виде
.
Этот ряд удобен тем, что его члены
независимы друг от друга, и значит, их
можно считать параллельно. Т.е. нам
требуется разбить ряд на m
частей (где m- количество
хостов в кластере), и считать каждую
часть по отдельности. В конце расчетов,
m частей суммируются.
Число n здесь – это
количество рассчитываемых членов, чем
оно больше, тем точнее число. При этом
для равномерной загрузке всех хостов
n желательно делать кратным
m. Т.е. Если в расчете
участвуют 4 хоста, n должно
делиться на 4. Иначе некоторые хосты
будут простаивать при последних
подсчетах, хотя для малых m
– это не скажется на производительности.
Расчет можно вести блочно (n/m
членов подряд для каждого хоста), или
через строчно (n для 1
хоста, n+1, для 2 хоста, …).
Процедуры, которые можно использовать при написании программы:
MPI_Init |
Для запуска MPI интерфейса |
MPI_Comm_size |
Для получения количества процессов в кластере |
MPI_Comm_rank |
Для получения номера процесса в кластере |
MPI_Get_processor_name |
Для получения имени компьютера, на котором находится процесс |
MPI_Bcast |
Для рассылки количества итераций на все процессы. |
MPI_Reduce |
Для сложения рассчитанных частей в одну переменную |
MPI_Wtime |
Для получения текущего времени, для подсчета времени выполнения |
MPI_Finalize |
Для завершения работы с MPI |
Алгоритм
