PobedilRomanskogo / Введение в MPI
.pdfВведение в параллельное программирование с помощью библиотеки MPI часть 1
1
С.О. Романский, 2011г.
Что такое MPI?
MPI – Message-Passing Interface (интерфейс передачи сообщений).
1994г./2008г. – стандарт MPI 1.0-1.3. 1997г./ 2009г. – стандарт MPI 2.0-2.2.
Идет разработка стандарта MPI 3.0.
Сайт сообщества: http://www.mpi-forum.org/
MPI = собственно библиотека и заголовочные файлы MPI + загрузчик приложений mpirun.
Библиотека MPI поддерживает взаимодействие
с языками Fortran и C/C++. |
2 |
|
MPI позволяет создавать программы в стиле MIMD= Multiple Instructions & Multiple Data. Но это сложно. Поэтому используют подход SPMD = Single
Program & Multiple Data.
MPI предоставляет программисту единый
механизм взаимодействия ветвей параллельного приложения независимо от машинной архитектуры.
Каждый процесс выполняет инструкции в своем адресном пространстве.
Основным способом взаимодействия между процессами является посылка сообщений.
3
Библиотека MPI содержит порядка 150 подпрограмм для параллельных вычислений. Соответственно при компиляции мы должны слинковать библиотеку MPI с нашей программой.
Все типы, подпрограммы MPI начинаются с префикса MPI_.
Не используйте этот префикс и MPID_, MPIR_, PMPI_ в своих переменных.
4
Реализации стандарта MPI
Стандарт говорит, что нужно сделать. Но не уточняет как. Это лежит на разработчике библиотеки MPI.
Реализации основаны на функциях API ядра
*NIX: POSIX threads, fork и т.д. (см. книгу Рочкинда «Программирование под UNIX»).
Некоторые реализации:
Intel MPI (плат., WIN+*NIX), OpenMPI (беспл., *NIX), MPICH (беспл. WIN+*NIX), WMPI (WIN) и
др.
На NIAGARA установлена реализация MPI под
названием OpenMPI v. 1.4.3. |
5 |
|
Сообщение – это набор данных стандартного или специально сформированного типа.
Группа – упорядоченное множество процессов. У каждого процесса в группе есть ранг. Группа не может быть расширена или усечена. На ее базе лишь можно создать новую.
Коммуникатор – объект, внутри которого идет обмен сообщениями между процессами этого коммуникатора. В одной программе их может быть несколько. Пересылать сообщения между разными коммуникаторами нельзя. Одной группе процессов может соответствовать несколько коммуникаторов.
Базовый коммуникатор MPI_COMM_WORLD связан
с группой, объединяющей все доступные процессы.
6
Hello, world!
Fortran:
!компиляция mpif90 basic.hello.f90 -o basic.hello.mpi.exe program hello_world
use mpi ! подключили mpi
integer :: err, sz, rk |
! код ошибки, количество процессов, ранг |
call MPI_INIT(err) |
! инициализация MPI |
call MPI_COMM_SIZE(MPI_COMM_WORLD,sz,err) ! sz процессов в коммуникаторе call MPI_COMM_RANK(MPI_COMM_WOLRD,rk,err) ! номер rk тек. процесса write(*,*)"Я - процесс #",rk," из ",sz, ". "
call MPI_FINALIZE(err) |
! завершить работу с MPI |
end program hello_world |
|
C:
// компиляция: mpicc hello.c -o hello.mpi.exe #include <stdio.h>
#include <mpi.h> // MPI header int main (int argc, char *argv[])
{
int rk, sz, err; |
|
err = MPI_Init(&argc, &argv); |
// start MPI |
err = MPI_Comm_size(MPI_COMM_WORLD, &sz); |
// get number of processes |
err = MPI_Comm_rank(MPI_COMM_WORLD, &rk); |
// get current process id |
printf("Hello world from process %d of %d\n", rk, sz);
err = MPI_Finalize(); |
// finish MPI |
return 0; |
7 |
}
Виды подпрограмм MPI
Блокирующие - останавливают (блокируют) выполнение процесса до тех пор, пока производимая ими операция не будет выполнена. Неблокирующие подпрограммы возвращают управление немедленно, а выполнение операции продолжается в фоновом режиме; за завершением операции надо проследить особо. Они возвращают запросы (request), которые погашаются при завершении. До погашения запроса с переменными и массивами, которые были аргументами неблокирующей функции, НИЧЕГО ДЕЛАТЬ НЕЛЬЗЯ (другому процессу могут отправиться измененные данные).
Локальные - не инициируют пересылок данных между ветвями. Большинство информационных подпрограмм является локальными, т.к. копии системных данных уже хранятся в каждой ветви. Подпрограммы передачи MPI_SEND и синхронизации MPI_BARRIER НЕ являются локальными, поскольку производят пересылку. А к примеру, MPI_RECV является локальной: она всего лишь пассивно ждет поступления данных, ничего не пытаясь сообщить другим ветвям.
Коллективные - должны быть вызваны ВСЕМИ процессами того коммуникатора, который передается им в качестве аргумента.
Несоблюдение для них этого правила приводит к ошибкам на стадии |
|
выполнения программы. Например, cбор данных ото всех ветвей с |
|
помощью MPI_REDUCE. |
8 |
Базовые процедуры MPI
call MPI_INIT(err) – начальный вызов, которым инициализируется MPI.
call MPI_FINALIZE(err) – завершение работы с MPI.
Любая MPI-программа должна содержать эти
вызовы.
integer :: err !Код ошибки (выходной арг)
После вызова MPI_FINALIZE процессы продолжают исполняться параллельно до завершения программы (зависит от конкретной реализации MPI), но больше нельзя использовать вызовы MPI.
В переменную err будет записан код ошибки.
Если err == MPI_SUCCESS, то все хорошо.
9
Другие коды ошибок на слайде №23.
Инфо о процессах MPI
call MPI_COMM_SIZE(comm, sz, err) – получить размер коммуникатора comm.
call MPI_COMM_RANK(comm, rk, err) – получить номер текущего процесса в коммуникаторе comm.
integer :: sz !Количество доступных процессов integer :: rk !Ранг текущего процесса (от 0 до sz-1) integer :: comm! Коммуникатор
integer :: err ! Код ошибки
По-умолчанию, доступен коммуникатор MPI_COMM_WORLD, объединяющий все процессы:
! Получить число процессор в коммуникаторе MPI_COMM_WORLD
call MPI_COMM_SIZE(MPI_COMM_WORLD, sz, err)
Зная ранг rk текущего процесса, мы может управлять исполнением команд программы и балансировать нагрузку
на выч. узлы. |
10 |
|