Вычислительный центр им. А.А. Дородницына РАНРаздел виртуального курса
|
|
Эта работа следует за теорией, изложенной в модуле MPI коллективный обмен сообщениями I. Требуется вначале завершить работу по модулю Основы программирования в MPI , включая упражнения, прежде чем начинать данную лабораторную работу.
Упражнение 1 лабораторной работы ознакомит вас с основными функциями коллективной коммуникации: операциями рассылки (broadcast), сборки (gather) и глобального приведения (global reduction).
В упражнении 2 требуется вычислить π.
В упражнении 3 изучается метод Лапласа.
Рабочий файл на C: ex1.c
Название рабочего файла на С для записи решения: ex1_solved.c
Название файла С для записи решения C: ex1_c.data
Файл входных данных для программы на C: c.seed
Файл построения C программы: ex1_c.mak
Структура этой программы следующая:
Пожалуйста, при выполнении упражнения используйте следующую последовательность действий:
═
═════ mpicc -o ex1_solved.exe ex1_solved.c -lm
═══
═════ или соответствующий файл
построения, например:
═════
═════ nmake
/f ex1_c.mak
═
═════ Ключ -lm указывает на необходимость прикрепления математической библиотеки.
═════ mpirun -np 4 ex1_solved.exe -maxtime 5
═
═ ════Здесь выбрано 4 задачи и установлено максимальное время расчета, после которого программа будет удалена в случае зацикливания. ═
═
═════ (Указание максимального допустимого времени расчета √ обязательное требование!)
Существует два примера программ для вычисления π:
Это очень простая параллельная программа, в которой каждая задача независимо от остальных находит приближенное значение π. Объем работы, сделанный каждой задачей, остается тем же самым по мере увеличения количества задач, но при этом усредненное значение оказывается более правильным. Есть две версии: одна версия демонстрирует отправки и получения (pi_send), а другая использует коллективные коммуникации (pi_reduce).
Эта программа вычисляет π, используя интегральную аппроксимацию. Данный код представляет особый интерес, поскольку включает в себя несколько программ, которые иллюстрируют конверсию последовательного кода int_pi в параллельный код. Конечная версия кода записана в int_pi2.c.
Нарисуйте круг с радиусом 1 с центром в начале. Круг вписан в квадрат, углы которого в (-1,-1), (-1,1), (1,1) и (1,-1). Площадь круга, разделенного на площадь квадрата равна π/4.
Представьте себе этот круг как мишень. Координаты по x и y дротиков, попавших в мишень, являются случайными числами между -1 и 1. Дротики могут находиться как в пределах квадрата, так и в пределах круга. Программа приближает значение π, деля число дротиков, которые находятся в пределах круга на полное число брошенных дротиков и умножая результат на четыре.
int_pi использует простую интегральную аппроксимацию для расчета π.
Есть два способа извлечь выгоду из параллелизма: работа программы может занять меньшее время или же работа большей по объему программы может занять примерно то же самое время. Пример dboard_pi использует последний вариант.
Последовательное вычисление π включает бросание 5000 дротиков для каждой из десяти итерации, с накопленным средним числом, полученным в каждой итерации. При параллельном выполнении каждая задача работает независимо, сообщая о своем расчетном значении π задаче-мастеру (ID задачи равен 0). Мастер печатает накопленное среднее число. Чем больше задач, которые участвуют в вычислении, тем точнее рассчитывается значение π.
Код относится к SPMD-типу, то есть каждая задача запускается одними и теми же командами. Есть две версии программы. Pi_send использует отправки и получения низкого уровня, чтобы подсчитать собрать значения π. Pi_reduce использует операцию приведения из коллективных коммуникаций с предопределенной функцией приведения для сложения вектора с удвоенной точностью и плавающей точкой.
Файлы:
Откомпилируйте эти файлы, используя файл построения:
Для C:
nmake /f pi_c.mak
Определитесь с числом узлов для выполнения и исполните одну из учебных программ:
pi_send.exe или pi_reduce.exe
Файлы:
int_pi.c √ оригинальная последовательная версия кода int_pi.
int_pi1.c √ частично распараллеленный код, сведенный к SPMD, но без разделения работы и без передачи сообщений.
int_pi2.c √ название файла для финальной параллельной версии.
int_pi_c.mak √ файл построения.
Компиляция кода:
mpicc int_pi2.c -o int_pi2.exe -maxtime 5
или:
nmake /f int_pi_c.mak
Определитесь с числом узлов, которые будут использованы и выполните программу-мастер:
int_pi2.exe
Это пример программы 2-х-мерно-блочной декомпозиции. Она работает в парадигме SPMD (единственная программа, множественные данные). В программу включены примеры узлов, обменивающих значения на краях, проверка сходимости и использование некоторых из функций коллективной коммуникации MPI.
Эта программа использует схему конечных разностей для решения уравнения Лапласа для квадратной матрицы, размерность которой должна быть (4m+2)*(4m+2).
В данном случае программа определяет матрицу размера 48x48, которая разделена на четыре процессора.
Каждый рабочий процесс решает для себя, является ли он краем, углом или внутренним узлом, а так же с какими другими рабочими процессами он должен обмениваться сообщениями. Краевые узлы получают свои "локальные" граничные значения от "глобальных" граничных значений, при этом обмениваясь сообщениями со своими соседними внутренними узлами. Начальное значение всех точек равно среднему значению глобальных граничных величин. Последовательность итераций имеет следующий вид:
Каждый рабочий процесс обменивает краевые значения со своими четырьмя соседями. Далее, новые значения рассчитываются для верхнего левого и нижнего правого углов ("красных" углов) матрицы у каждого узла. Рабочие процессы обменивают краевые значения снова. Затем рассчитываются верхний правый и нижний левый углы ("черные" углы).
Через каждые 20 итераций узлы вычисляют среднюю разницу между текущими значениями каждой точкой и значениями в этой точек 20 итераций назад. Эти локальные средние разности собираются задачей с номером 0 и высчитывается глобальная средняя разница. Если она меньше, чем некоторое приемлемое значение, то задача 0 собирает куски матрицы. В противном случае подсчитываются еще 20 итераций.
Инструкции по компиляции и запуску
файлы C:
o parallel_laplace.c √ файл параллельной реализации
o parallel_laplace.mak √ файл построения
2. Откомпилируйте, используя предоставленный файл построения.
═══════════ nmake /f parallel_laplace.mak
3. Отпределите 4 процессора для запуска программы (mpirun -np 4 ...)
4. Выполнить программу parallel_laplace.exe.
mpirun -np 4 parallel_laplace.exe -maxtime 3
Результаты запомнить в parallel_laplace.out.
После завершения работы программ и отправки решения преподавателю не забудьте очистить ваш рабочий каталог на кластерном компьютере ВЦ РАН. Исходные тексты программ можно хранить на сервере Fast в вашем каталоге.
|
╘ 2003 Вычислительный центр им.
А.А.Дородницына Все права защищены. |
|