- •Лекция 1 Классификация многопроцессорных систем
- •Сетевой закон Амдала
- •Лекция 2 Техническая реализация многопроцессорных систем
- •Лекция 3 Система передачи сообщений mpi
- •Принципы работы mpich
- •Лекция 4 Структура mpi-программы
- •Int main(int argc, char* argv[]) { int procs_rank, procs_count; // Определяем переменные
- •Int mpi_Init (int* argc, char*** argv)
- •Int mpi_Comm_size(mpi_Comm comm, int *size)
- •Int mpi_Comm_rank(mpi_Comm comm, int *rank)
- •Int mpi_Finalize(void)
- •Определение времени выполнения mpi программы
- •Понятие коммуникатора
- •Лекция 5 Передача сообщений
- •Общие сведения о функциях передачи сообщений
- •Передача сообщения «точка-точка»
- •Int mpi_Send(void *buf, int count, mpi_Datatype type, int dest, int tag, mpi_Comm comm)
- •Прием сообщений «точка-точка» с блокировкой
- •Int mpi_Recv(void *buf, int count, mpi_Datatype type, int source, int tag, mpi_Comm comm, mpi_Status *status)
- •Int main(int argc, char* argv[])
- •Int ProcNum, ProcRank, RecvRank;
- •Лекция 6 Определение времени выполнения программы
- •Int s1; // Место под результат
- •Int size; // Размер принимаемого массива
- •Int Summa; // Сумма его элементов
- •Input n: 1000
- •Лекция 7 Функции неблокирующего обмена данными
- •Int mpi_Test(mpi_Request *request, int *flag,
- •Int mpi_Wait(mpi_Request *request, mpi_status *status)
- •Одновременное выполнение приема и передачи данных
- •Int mpi_Sendrecv (void *sbuf, int scount,
- •Int stag, void *rbuf, int rcount,
- •Int rtag, mpi_Comm comm,
- •Int mpi_Sendrecv_replace (void *buf, int count,
- •Int stag, int source,
- •Int rtag, mpi_Comm comm,
- •Лекция 8 Коллективные операции передачи данных
- •Функция синхронизации процессов
- •Int mpi_Barrier(mpi_Comm comm);
- •Широковещательная рассылка данных
- •Int mpi_Bcast (void* buffer, int count,
- •Int main(int argc, char* argv[])
- •Int proc_rank, proc_count;
- •Широковещательная рассылка индивидуальных данных
- •Int mpi_Scatter
- •Void *rbuf, int rcount, mpi_Datatype rtype,
- •Int root, mpi_Comm comm)
- •Лекция 9 Функции сбора блоков данных от всех процессов группы
- •Int mpi_Gather
- •Void* recvbuf, int recvcount, mpi_Datatype recvtype,
- •Int root, mpi_Comm comm);
- •Int array[100];
- •Int root, *rbuf, proc_count;
- •Int mpi_Allgather
- •Void *rbuf, int rcount, mpi_Datatype rtype,
- •Передача данных от всех процессов всем процессам
- •Int mpi_Alltoall
- •Void *rbuf, int rcount, mpi_Datatype rtype,
- •Лекция 10 Редукция данных
- •Int mpi_Reduce (void *sendbuf, void *recvbuf,
- •Int count, mpi_Datatype type,
Лекция 3 Система передачи сообщений mpi
MPI (Message Passing Interface) – интерфейс обмена сообщениями (информацией) между одновременно работающими вычислительными процессами. Он широко используется для создания параллельных программ для вычислительных систем с распределённой памятью (кластеров). MPICH – самая известная реализация MPI, созданная в Арагонской национальной лаборатории(США). Существуют версии этой библиотеки для всех популярных операционных систем. К тому же, она бесплатна. Перечисленные факторы делают MPICH идеальным вариантом для того, чтобы начать практическое освоение MPI.
Мы будем рассматривать пакет MPICH2. Двойка в названии – это не версия программного обеспечения, а номер того стандарта MPI, который реализован в библиотеке. MPICH2 соответствует стандарту MPI 2.0. Сайт разработчика так характеризует данный пакет:
MPICH2 – это быстродействующая и широко портируемая реализация стандрта MPI(реализованы оба стандарта MPI-1 иMPI-2). Цели создания MPICH2 следующие:
1. Предоставить реализацию MPI, которая эффективно поддерживает различные вычислительные и коммуникационные платформы, включая общедоступные кластеры (настольные системы, системы с общей памятью, многоядерные архитектуры), высокоскоростные сети (Ethernet, InfiniBand, Myrinet, Quadrics) и эксклюзивные вычислительные системы (Blue Gene, Cray, SiCortex).
2. Сделать возможными передовые исследования технологии MPI с помощью легко расширяемой модульной структуры для создания производных реализаций.
В дальнейшем будем полагать, что у нас имеется сеть из нескольких персональных компьютеров (будем называть их вычислительными узлами), работающих под управлением Windows. Можно даже настроить систему на двух ноутбуках, соединённых беспроводной сетью. Кроме того, в учебных целях можно запускать все вычислительные процессы и на одном компьютере. Если компьютер одноядерный, то, естественно, использование MPI не даст прироста в быстродействии – будет только замедление.
В качестве среды разработки удобно использовать пакет Visual Studio.
Принципы работы mpich
MPICH для Windows состоит из следующих компонентов:
– Менеджер процессов smpd.exe, который представляет собой системную службу (сервисное приложение). Менеджер процессов ведёт список вычислительных узлов системы, и запускает на этих узлах MPI-программы, предоставляя им необходимую информацию для работы и обмена сообщениями.
– Заголовочные файлы (.h) и библиотеки стадии компиляции (.lib), необходимые для разработки MPI-программ.
– Библиотеки времени выполнения (.dll), необходимые для работы MPI-программ.
– Дополнительные утилиты (.exe), необходимые для настройки MPICH и запуска MPI-программ.
Все компоненты, кроме библиотек времени выполнения, устанавливаются по умолчанию в папку C:\Program Files\MPICH2; dll-библиотеки устанавливаются в C:\Windows\System32.
Менеджер процессов является основным компонентом, который должен быть установлен и настроен на всех компьютерах сети (библиотеки dll можно, при необходимости, копировать вместе с MPI-программой). Остальные файлы требуются для разработки MPI-программ и настройки некоторого «главного» компьютера, с которого будет производиться их запуск.
Менеджер работает в фоновом режиме и ждёт запросов к нему из сети со стороны «главного» менеджера процессов (по умолчанию используется сетевой порт 8676). Чтобы ограничить доступ к ресурсам вычислительного кластера, менеджер требует пароль при обращении к нему. Когда один менеджер процессов обращается к другому менеджеру процессов, он передаёт ему свой пароль. Таким образом, нужно указывать один и тот же пароль при установке MPICH на все компьютеры вычислительного кластера.
Запуск MPI-программы производится следующим образом (рис. 1):
Пользователь с помощью программы mpiexec (или ее аналога wmpiexec с графическим интерфейсом) указывает имя исполняемого файла MPI-программы и требуемое число процессов. Также следует указать имя пользователя и пароль: все процессы MPI-программы будут запускаться от имени этого пользователя.
Mpiexec передаёт сведения о запуске локальному менеджеру процессов, у которого имеется список доступных вычислительных узлов.
Менеджер процессов обращается к вычислительным узлам по списку, передавая запущенным на них менеджерам процессов указания по запуску MPI-программы.
Менеджеры процессов запускают на вычислительных узлах несколько копий MPI-программы (возможно, по несколько копий на каждом узле), передавая программам необходимую информацию для связи друг с другом.
Рис. 1. Схема работы системы MPICH на вычислительном кластере.
Важным моментом здесь является то, что перед своим запуском MPI-программа не копируется автоматически на вычислительные узлы кластера (что обусловлено отсутствием соответствующих прав доступа). Вместо этого менеджер процессов передаёт узлам путь к исполняемому файлу MPI-программы точно в том виде, в котором пользователь указал этот путь программе Mpiexec. Это означает, что если вы, например, запускаете программу C:\laba.exe, то все менеджеры процессов на вычислительных узлах будут пытаться запустить файл C:\laba.exe. Если хотя бы на одном из узлов такого файла не окажется, произойдёт ошибка запуска MPI-программы.
Чтобы каждый раз не копировать вручную программу и все необходимые для её работы файлы на вычислительные узлы кластера, обычно используют общий сетевой ресурс (папку, к которой в локальной сети разрешен общий доступ). В этом случае пользователь копирует программу и дополнительные файлы на сетевой ресурс, видимый всеми узлами кластера, и указывает путь к файлу программы на этом ресурсе. Дополнительным удобством такого подхода является то, что при наличии возможности записи на общий сетевой ресурс запущенные копии программы могут записывать туда результаты своей работы.
Работа MPI-программы происходит следующим образом:
Программа запускается и инициализирует библиотеку времени выполнения MPICH путём вызова функции MPI_Init.
Библиотека получает от менеджера процессов информацию о количестве и местоположении других процессов программы, и устанавливает с ними связь.
После этого запущенные копии программы могут обмениваться друг с другом информацией посредством библиотеки MPICH. С точки зрения операционной системы библиотека является частью программы (работает в том же процессе), поэтому можно считать, что запущенные копии MPI-программы обмениваются данными напрямую друг с другом, как любые другие приложения, передающие данные по сети.
Консольный ввод-вывод всех процессов MPI-программы перенаправляется на консоль, на которой запущена Mpiexec.
Перед завершением все процессы вызывают функцию MPI_Finalize, которая корректно завершает передачу и приём всех сообщений, и отключает MPICH.
Все описанные выше принципы действуют и в том случае, если запускать MPI-программу на одном компьютере.
