Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PobedilRomanskogo / Введение в MPI

.pdf
Скачиваний:
19
Добавлен:
13.04.2015
Размер:
951.87 Кб
Скачать

Введение в параллельное программирование с помощью библиотеки 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

 

Соседние файлы в папке PobedilRomanskogo