- •Лабораторные работы по курсу «Параллельное программирование»
- •Кластер Beowulf
- •Структура кластера кафедры 304
- •Организация взаимодействия между процессами при параллельных вычислениях
- •Основные функции mpi
- •Вычисление числа π методом численного интегрирования
- •Вычисление числа π методом Монте-Карло
- •Содержание отчета
- •Лабораторная работа №2
- •Введение
- •Коммуникации точка-точка в mpi
- •Коллективные коммуникации в mpi
- •Алгоритмы параллельного поиска и сортировки
- •Задание
- •Содержание отчета
- •Лабораторная работа №3
- •Введение
- •Умножение матриц ленточным методом
- •Алгоритм Фокса умножения матриц
- •Пример работы Fox's алгоритма
- •Этап 0 (шаг 1 ( слева ), шаг 2 ( по центру ), шаг 3 ( справа ) ):
- •Этап 1 ( слева ) и этап 2 (справа ):
- •Содержание отчета
- •Список литературы
Коллективные коммуникации в mpi
Основным неудобством при работе с функциями коммуникаций точка-точка является плохая масштабируемость программы, так как приходиться явно задавать ранги процессов и предотвращать возникновение блокировок. При увеличении числа узлов в кластере такие программы становятся слишком запутанными, поэтому в MPI существует набор функций, обеспечивающих обмен сообщениями одновременно между всеми процессами коммуникатора:
Барьерная синхронизация процессов коммуникатора
Рассылка одних и тех же данных от одного процесса всем (broadcast)
Сбор данных одним процессом от остальных (gather)
Разделение данных одного процесса между всеми процессами (scatter)
Вариация сбора данных, при которой все процессы получают результат (allgather)
Обмен данными "каждый с каждым" (alltoall)
Редукционные операции
Комбинированные операции редукции и разделения
Частичные редукционные операции
Барьерная синхронизация процессов коммуникатора int MPI_Barrier( MPI_Comm comm ) – после ее вызова вызвавший процесс блокируется до тех пор, пока все процессы коммуникатора не вызовут эту функцию.
int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root,
MPI_Comm comm ) – рассылает данные, находящиеся по адресу buffer процесса с рангом root всем процессам коммуникатора comm.
int MPI_Gather ( void *sendbuf, int sendcnt, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm ) –
Данные из буферов sendbuf в количестве sendcount всех процессов в порядке возрастания рангов копируются в буфер recvbuf процесса с рангом root.
int MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm) – Функция MPI_Scatter выполняет действия, обратные функциям MPI_Gather, а именно, рассылает данные, находящиеся по адресу sendbuf процесса с рангом root, всем процессам коммуникатора.
int MPI_Allgather ( void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm ) - Отличие этой функции от MPI_Gather в том, что итоговый массив получают все процессы коммуникатора.
int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm ) - все процессы обмениваются данными со всеми.
Действия перечисленных функций коллективных коммуникаций показаны на рисунке 2.
Иногда бывает необходимо вычислить значение какой-то величины на основании частичных ее значений, вычисленных в нескольких процессах программы. Например, каждый процесс может вычислить частичную сумму, и на основании этих значений необходимо вычислить полную сумму. Или необходимо выбрать минимум из локальных минимумов и т. д.
В MPI есть следующие встроенные редукционные операции
MPI_MAX - максимум
MPI_MIN - минимум
MPI_SUM - сумма
MPI_PROD - произведение
MPI_LAND - логическое «и»
MPI_BAND - побитовое «и»
MPI_LOR - логическое «или»
MPI_BOR - побитовое «или»
MPI_LXOR - логическое «исключающее или»
MPI_BXOR - побитовое «исключающее или»
MPI_MAXLOC - максимум и его расположение
MPI_MINLOC - минимум и его расположение
int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
MPI_Op op, int root, MPI_Comm comm)
Рис. 2 – функции коллективных коммуникаций в MPI
Параметры:
sendbuf - адрес, по которому находятся отправляемые данные
count - число элементов в sendbuf, к которым требуется применить операцию редукции
datatype - тип данных
op - редукционная операция
root - ранг процесса, который получит итоговое значение (корневого процесса)
comm - коммуникатор
recvbuf - адрес, по которому будет записано итоговое значение (запись произойдет только в процессе с рангом root).
Более подробное описание основных функций MPI находится в приложении А.
