Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка для MPI.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
506.88 Кб
Скачать

5. Примечания

Используйте функцию fflush(stdout) после вызова printf(). Иначе вы можете и не увидеть вывод на экран во время ввода и обработки данных, в противном случае увидите только после окончания работы программы. Это связано с тем, что текст, подаваемый на stdout – буферизуется, что приводит к тому, что вывод от удаленного хоста не приходит на консоль компьютера, с которой был осуществлен запуск. Функция fflush() принудительно сбрасывает буфер для stdout.

Иногда можно заметить, что ответ от удаленного хоста приходит со значительным опозданием, т.е. уже после прохождения цикла, во время ожидания ввода следующего числа. Это происходит, потому что функция MPI_Bcast() является буферной, т.е. после выполнения, управление программы сразу же передается следующему оператору, а передаваемое сообщение заносится в специальный буфер для передачи. В результате, мы можем сразу же после отработки MPI_Bcast() изменять содержимое буфера. Это позволяет рассылать сообщения и другим хостам или продолжать дальнейшую работу, не ожидая ответа удаленного хоста. Данные задержки могут быть связанны с загруженностью сети, или удаленного хоста. Чтобы программа ожидала окончания работы каждого узла – можно использовать синхронные функции передачи (с подтверждением). А можно, после рассылки всем процессам нужных данных, перед запуском параллельной обработки, использовать функцию MPI_Barrier(comm). Данная функция не возвращает управления, пока передачи между процессами не закончатся. Так же не стоит забывать, что передача данных происходит не только всем остальным хостам, но и хосту-отправителю. Поэтому функцию получения данных необходимо разместить и в блоке (обычно для ведущего хоста) откуда был вызван MPI_Bcast().

Лабораторная работа № 3 Вычисление числа π

  1. Подготовка к работе

Необходимо иметь в наличие работающий кластер на базе MPICH. Уметь программировать на языке С. Ознакомиться со способом расчета числа π, приведенного в методических указаниях.

  1. Контрольные вопросы

  1. Может ли параллельная программа работать на гетеродинном класере?

  2. Что такое гетеродинный кластер?

  3. Чем отличается паралельная программа (с интерфейсом MPI) от обычной программы?

  4. Опишите способ расчет числа π использованного в данной лабораторной работе.

  5. Назначение функции MPI_Reduce.

  6. Назначение функции MPI_Wtime.

  7. Почему число периодов желательно задавать числу процессов?

  8. Поясните ход программы по блок-схеме.

  1. Задание

Написать программу для расчета числа π по указанной блок-схеме.

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

Алгоритм