Message Passing Interface

Содержание

Слайд 2

Введение Message Passing Interface (MPI, интерфейс передачи сообщений) — программный интерфейс

Введение

Message Passing Interface (MPI, интерфейс передачи сообщений) — программный интерфейс (API) для передачи информации,

который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу.
Первая версия MPI разрабатывалась в 1993—1994 году, и MPI 1 вышла в 1994.
Слайд 3

Стандарты MPI MPI 1 - 1994. MPI 1.1 -12 июня 1995

Стандарты MPI

MPI 1 - 1994.
MPI 1.1 -12 июня 1995 года
MPI 2.0 -

18 июля 1997 года
MPI 2.1 - сентябрь 2008 года
MPI 2.2 - 4 сентября 2009 года
MPI 3.0 - 21 сентября 2012 года
Слайд 4

Реализации MPI MPICH — одна из самых распространенных реализация MPI, работает

Реализации MPI

MPICH — одна из самых распространенных реализация MPI, работает на UNIX и Windows-системах


Open MPI — ещё одна свободная реализация MPI. Основана на более ранних проектах FT-MPI, LA-MPI, LAM/MPI и PACX-MPI.
MPI/PRO for Windows NT — коммерческая реализация для Windows NT
Intel MPI — коммерческая реализация для Windows / Linux
Microsoft MPI входит в состав Compute Cluster Pack SDK. Основан на MPICH2, но включает дополнительные средства управления заданиями. Поддерживается спецификация MPI-2.
HP-MPI — коммерческая реализация от HP
SGI MPT — платная библиотека MPI от SGI
Mvapich — свободная реализация MPI для Infiniband
Oracle HPC ClusterTools — бесплатная реализация для Solaris SPARC/x86 и Linux на основе Open MPI
MPJ — MPI for Java
MPJ Express — MPI на Java
Слайд 5

Слайд 6

Слайд 7

Слайд 8

Слайд 9

Слайд 10

Слайд 11

Настройка системы

Настройка системы

Слайд 12

В настройках проекта установить: Дополнительные каталоги включаемых файлов: $(MSMPI_INC);$(MSMPI_INC)\x86 или $(MSMPI_INC);$(MSMPI_INC)\x64

В настройках проекта установить:

Дополнительные каталоги включаемых файлов:
$(MSMPI_INC);$(MSMPI_INC)\x86
или
$(MSMPI_INC);$(MSMPI_INC)\x64

Слайд 13

Слайд 14

В меню «Компоновщик»: Добавить в «Дополнительные зависимости» файл msmpi.lib Добавить в

В меню «Компоновщик»:
Добавить в «Дополнительные зависимости» файл msmpi.lib
Добавить в «Дополнительные каталоги

библиотек» ссылку на папку:
$(MSMPI_LIB32)
Или
$(MSMPI_LIB64)
Слайд 15

Слайд 16

Если разрядность программы не соответствует разрядности подключенных библиотек, то возникнут такие

Если разрядность программы не соответствует разрядности подключенных библиотек, то возникнут такие

ошибки:
LNK1120: 5 unresolved externals LNK2019: unresolved external symbol _MPI_Comm_rank@8 referenced in function _main LNK2019: unresolved external symbol _MPI_Finalize@0 referenced in function _main LNK2019: unresolved external symbol _MPI_Init@8 referenced in function _main LNK2019: unresolved external symbol _MPI_Recv@28 referenced in function _main
Слайд 17

Первое приложение

Первое приложение

Слайд 18

Запуск приложения На каждой машине запустить демон: smpd -d На управляющем

Запуск приложения

На каждой машине запустить демон:
smpd -d
На управляющем узле выполнить команду

запуска программы:
mpiexec -hosts КоличХостов IP1 КолПроц1
IP2 КолПроц2 … IPN КолПроцN -wdir ПутьКПапкеСПрограммой ИмяФайла.exe
Слайд 19

Запуск приложения Пример строки запуска программы на 3-х хостах: mpiexec -hosts

Запуск приложения

Пример строки запуска программы на 3-х хостах:
mpiexec -hosts 3 192.168.0.2

2 192.168.0.3 2 127.0.0.1 3 -wdir \\192.168.0.1\MPIProgram Example.exe
Результат:
Hello world from processor one, rank 4 out of 7 processors
Hello world from processor one, rank 3 out of 7 processors
Hello world from processor two, rank 6 out of 7 processors
Hello world from processor two, rank 5 out of 7 processors
Hello world from processor quad, rank 2 out of 7 processors
Hello world from processor quad, rank 0 out of 7 processors
Hello world from processor quad, rank 1 out of 7 processors
Слайд 20

Общая схема работы MPICH на кластере

Общая схема работы MPICH на кластере

Слайд 21

Первое приложение

Первое приложение

Слайд 22

Константы

Константы

Слайд 23

Функции и константы MPI_COMM_WORLD – все процессы (константа) int MPI_Init( int*

Функции и константы

MPI_COMM_WORLD – все процессы (константа)
int MPI_Init( int* argc, char**

argv)
int MPI_Finalize()
int MPI_Comm_size( MPI_Comm comm, int* size) – определить количество запущенных процессов:
int size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
int MPI_Comm_rank( MPI_comm comm, int* rank) – определение номера процесса в группе
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int MPI_Abort(MPI_Comm comm, int errorcode ) – аварийное завершение работы процессов
MPI_Abort(MPI_COMM_WORLD,MPI_ERR_OTHER);
Слайд 24

Функции int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int

Функции

int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int msgtag,

MPI_Comm comm) – передача сообщения
buf - адрес начала буфера посылки сообщения
count - число передаваемых элементов в сообщении
datatype - тип передаваемых элементов
dest - номер процесса-получателя
msgtag - метка сообщения
comm - идентификатор группы
#define N 10

int rank, buf[N];

MPI_Send(buf, N, MPI_INT, 1, 10, MPI_COMM_WORLD);
Слайд 25

Функции int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int

Функции

int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int msgtag,

MPI_comm comm, MPI_Status *status) – прием сообщения (блокирующая функция)
выходной параметр buf - адрес начала буфера приема сообщения
count - максимальное число элементов в принимаемом сообщении
datatype - тип элементов принимаемого сообщения
source - номер процесса-отправителя
msgtag - метка принимаемого сообщения
comm - идентификатор группы
выходной параметр status - параметры принятого сообщения
#define N 10

int rank, buf[N];
MPI_Status status;

MPI_Recv(buf, N, MPI_INT, 1, 10, MPI_COMM_WORLD, &status);

Слайд 26

Функции int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status status) –

Функции

int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status status) – проверка

приемного буфера
source - номер процесса-отправителя
tag - метка сообщения
comm - идентификатор группы
выходной параметр status - параметры принятого сообщения
MPI_Status status;

MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
Слайд 27

Структура MPI_Status Содержит поля: MPI_SOURCE (источник), MPI_TAG (метка), MPI_ERROR (ошибка). MPI_Status

Структура MPI_Status

Содержит поля:
MPI_SOURCE (источник),
MPI_TAG (метка),
MPI_ERROR (ошибка).
MPI_Status status;

MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,

&status);
Слайд 28

Функции int MPI_Get_count(MPI_Status status, MPI_Datatype datatype, int *count ) – определение

Функции

int MPI_Get_count(MPI_Status status, MPI_Datatype datatype, int *count ) – определение размера

сообщения
status - информация о сообщении
datatype - тип принимаемых элементов
выходной параметр count - число элементов сообщения
MPI_Status status;
int count;

MPI_Get_count(&status, MPI_INT, &count);
Слайд 29

Простой пример 1

Простой пример
1

Слайд 30

Слайд 31

Слайд 32

Слайд 33

Простой пример 2

Простой пример
2

Слайд 34

Слайд 35