Форма поиска

 

Библиотеки. MPI

Расположение:

Название Версия Переменные окружения и путь
Intel MPI* 2018 source /usr/local/ipsxece/ipsxece_2018_u3/impi/2018.3.222/bin64/mpivars.sh
Open MPI 2.1.0 /usr/local/OPENMPI/2.1.0-ifort/
MPICH 1.4 /usr/local/mpich2-1.4.INT.20110813/

* - при сборке  MPi-программ и работе с ними в Вычислительном центре СПбГУ мы настоятельно рекомендуем использовать оптимизированную версию MPI от фирмы Intel.

СОДЕРЖАНИЕ
 
 
Введение
 
MPI (Message Passing Interface) - это хорошо стандартизованный коммуникационный интерфейс для создания параллельных программ в модели передачи сообщений. Этот механизм разрабатывался, в первую очередь, для многопроцессорных систем с распределенной памятью, однако, возможно его использованию и на системах с общей памятью. В этом случае в качестве коммуникационной среды выступает общая память. В MPI включены специальные драйверы, имитирующие передачу сообщений через общую память. Таким образом, MPI - это одна из наиболее универсальных технологий параллельного программирования, которую можно использовать на любых многопроцессорных системах.
 
MPI представляет собой библиотеку, добавляющую поддержку механизма передачи сообщений в стандартные языки программирования, такие как C/C++ и Фортран. Разрабатывался MPI специально созданным в 1992 г. консорциумом MPI Forum, в который вошли практически все разработчики многопроцессорных систем и программного обеспечения для них. Первая реализация MPI-1.1 вышла в 1995 г.
 
В 1997 г. вышла исправленная и доработанная версия MPI-1.2. Эта версия по сей день является базовой для MPI-1. Текущей версией является версия 2.0, первая реализация которой появилась в 1998 году. Эта версия открыла новое направление развития MPI-2.
 
Основное отличие MPI-2 от MPI-1 состоит в том, что добавлено динамическое управление процессами, односторонние операции, параллельные ввод/вывод, расширенный набор коллективных операций. Однако следует отметить, что до сих пор ни одна реализация MPI-2 не поддерживает стандарт 2.0 в полной мере. Все реализации в полной мере поддерживают стандарт 1.2 с некоторыми элементами стандарта 2.0.
 
На сегодняшний день имеется множество коммерческих и специализированных реализаций <заточенных> под высокоскоростное коммуникационное оборудование (Infiniband, Marynet, QsNet). Кроме того, успешно развиваются две свободно распространяемых версии - MPICH (Argonne National Laboratory) и LAM/MPI (Ohio Supercomputer Center). В зависимости от предпочтений, либо одна, либо другая версии включаются в различные дистрибутивы ОС Linux. В настоящее время большинство разработчиков сосредоточили свои усилия на проекте OpenMPI, в котором объединены оба стандарта MPI и поддерживается широкий спектр коммуникационного оборудования.
 
В MPI-1 имеется порядка 130 функций, тем не менее, большинство параллельных программ могут быть написаны с использованием всего шести базовых функций: MPI_INIT (), MPI_FINALIZE (), MPI_COMM_SIZE (), MPI_COMM_RANK (), MPI_SEND () и MPI_RECV (). Рассмотрим реализацию нашей программы вычисления числа π с использование указанных средств.
 
Программа вычисления числа π

Базовые функции MPI
Любая MPI-программа должна начинаться с вызова функции инициализации MPI_Init. В результате выполнения этой функции создается группа процессов, в которую помещаются все процессы, запущенные командой mpirun, и создается область связи (группа взаимодействующих процессов), описываемая предопределенным коммуни-катором (специальным объектом, описывающим область связи) MPI_COMM_WORLD. Процессы в группе упорядочены и пронумерованы от 0 до numprocs-1, где numprocs равно числу процессов в области связи. Число процессов в области связи можно определить с помощью процедуры MPI_COMM_SIZE(), а номер каждого процесса можно опросить процедурой MPI_COMM_RANK().
 
В нашей программе нулевой процесс требует ввести число интервалов разбиения и затем рассылает эту переменную с помощью процедуры MPI_SEND() всем остальным процессам. В MPI одна и та же процедура служит для передачи различных типов данных. Тип передаваемых данных указывается третьим аргументом. Первый аргумент указывает адрес начала расположения передаваемых данных, а второй указывает их количество. Естественно, при посылке данных необходимо указывать адресата, т.е. процесс, которому они предназначены. Адресат указывается 4-м параметром. Пятый параметр указывает идентификатор сообщения.
 
Процессы-получатели для получения сообщения использует процедуру MPI_RECV(). Параметры этой процедуры почти полностью совпадают с параметрами MPI_SEND().
 
Второй пакет коммуникационных операций выполняет пересылку частичных сумм от каждого процесса нулевому процессу для вычисления полной суммы.
 
Программа выглядит довольно громоздко, потому что в ней сознательно использовался минимальный набор MPI функций. Для выполнения таких операций как рассылка данных или сборка частичных сумм в библиотеке MPI имеются специальные коллективные операции. Программа с использованием таких операций будет гораздо нагляднее и компактней. Приведем пример такой более компактной программы на языке Си:

 
Процедура MPI_Bcast () рассылает данные, указанные первым параметром, от процесса указанного 4-м параметром всем остальным процессам. Процедура MPI_Reduce (..., MPI_SUM, ...) выполняет глобальное суммирование частичных сумм.
 
 
Пример 1 - сборка и запуск программы вычисления числа П на языке Си с использованием MPI.
$ # Инициализируем необходимые переменные окружения для Intel Parallel Studio 2018
$ source /usr/local/ipsxece/ipsxece_2018_u3/bin/compilervars.sh intel64
$ source /usr/local/ipsxece/ipsxece_2018_u3/mkl/bin/mklvars.sh intel64
$ source /usr/local/ipsxece/ipsxece_2018_u3/impi/2018.3.222/bin64/mpivars.sh
$
$ MPI_TEST_PATH=/usr/local/hpc/testfiles/mpi/
$
$ # Компилируем MPI-программу
$ mpiicc $MPI_TEST_PATH/pi_mpi.c
$
$ # Запускаем MPI-программу на 6 процессорах
$ mpirun -np 6 ./a.out 1000
pi is 3.1415927369231267, Error is 0.0000000833333336
wall clock time = 0.000465
$
 
 
Пример 2 - Сборка крупных научных программ при помощи Intel Parallel Studio 2018 с поддержкой всех платформ Вычислительного центра.
$ # Инициализируем необходимые переменные окружения для Intel Parallel Studio 2018
$ source /usr/local/ipsxece/ipsxece_2018_u3/bin/compilervars.sh intel64
$ source /usr/local/ipsxece/ipsxece_2018_u3/mkl/bin/mklvars.sh intel64
$ source /usr/local/ipsxece/ipsxece_2018_u3/impi/2018.3.222/bin64/mpivars.sh
$
$ # Конфигурируем с Intel:
$ ./configure FC="ifort"  \
                     F77="ifort" \
                     F90="ifort" \
                     MPIF90="mpiifort" \
                     CC="icc" \
                     FFLAGS="-O3 -align -axCORE-AVX2,CORE-AVX-I,SSE4.2,SSSE3" \
                     F90FLAGS="-O3 -align -axCORE-AVX2,CORE-AVX-I,SSE4.2,SSSE3" \
                     CFLAGS="-O3 -align -axCORE-AVX2,CORE-AVX-I,SSE4.2,SSSE3" \
$ # После этого можно собирать ПО
$ make
$ make install