Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec22_mpi_pvm.ppt
Скачиваний:
17
Добавлен:
20.03.2015
Размер:
268.8 Кб
Скачать

Встроенные типы данных

C

Fortran

MPI_CHAR

MPI_CHARACTER

MPI_SHORT

MPI_INTEGER

MPI_INT

MPI_REAL

MPI_LONG

MPI_DOUBLE_PRECISION

MPI_UNSIGNED_CHAR

 

MPI_UNSIGNED_SHORT

MPI_COMPLEX

MPI_UNSIGNED_LONG

MPI_DOUBLE_COMPLEX

MPI_UNSIGNED

MPI_LOGICAL

MPI_FLOAT

MPI_BYTE

MPI_DOUBLE

MPI_PACKED

MPI_LONG_DOUBLE

 

MPI_BYTE

 

MPI_PACKED

 

Создание новых типов данных

Для сложных структур данных можно создать свой тип

Это упрощает сериализацию

Новый тип создается на основе уже существующих

MPI_Type_struct( count,
int *len,

Функции создания новых типов данных

/* количество полей */ /* массив с длинами полей */

/* (на тот случай, если это массивы) */ MPI_Aint *pos, /* массив со смещениями полей */

/* от начала структуры, в байтах */ MPI_Datatype *types, /* массив с описателями типов

полей */

MPI_Datatype *newtype ); /* ссылка на создаваемый тип */

Пример создания типа структуры

#include <stddef.h> /* подключаем макрос 'offsetof()' */ typedef struct {

int i; double d[3]; long l[8]; char c;

} AnyStruct;

AnyStruct st;

MPI_Datatype anyStructType;

int len[5] = { 1, 3, 8, 1, 1 };

MPI_Aint pos[5] = {

offsetof(AnyStruct,i), offsetof(AnyStruct,d), offsetof(AnyStruct,l), offsetof(AnyStruct,c), sizeof(AnyStruct)

};

MPI_Datatype typ[5] = { MPI_INT,MPI_DOUBLE,MPI_LONG,MPI_CHAR,MPI_UB }; MPI_Type_struct( 5, len, pos, typ, &anyStructType );

MPI_Type_commit( &anyStructType ); /* подготовка закончена */ MPI_Send( st, 1, anyStructType, ... );

Упаковка данных (сериализация)

Упаковка – запись разнотипных структур данных в один массив

int MPI_Pack(void *buf, int count, MPI_Datatype dtype, void *packbuf, int packsize, int *packpos, MPI_Comm comm)

INPUT PARAMETERS

buf - input buffer start (choice)

count - number of input data items (integer) dtype - datatype of each input data item (handle)

packsize - output buffer size, in bytes (integer)

comm - communicator for packed message (handle)

INPUT/OUTPUT PARAMETER

 

packpos

- current position in buffer, in bytes (integer)

OUTPUT PARAMETER

packbuf - output buffer start (choice)

Распаковка данных

int MPI_Unpack(void *packbuf, int packsize, int *packpos,

void *buf, int count, MPI_Datatype dtype, MPI_Comm comm)

INPUT PARAMETERS

 

packbuf

- input buffer start (choice)

 

packsize

- size of input buffer, in bytes (integer)

count - number of items to be unpacked (integer)

dtype - datatype of each output data item (handle)

comm - communicator for packed message (handle)

INPUT/OUTPUT PARAMETERS

packpos - current position in bytes (integer)

OUTPUT PARAMETER

buf - output buffer start (choice)

Пример упаковки- распаковки

#define msgTag 10 struct {

int i; float f[4]; char c[8];

} s;

Передача

int bufPos = 0;

char tempBuf[ sizeof(s) ];

MPI_Pack(&s.i, 1, MPI_INT, tempBuf, sizeof(tempBuf), &bufPos, MPI_COMM_WORLD );

MPI_Pack( s.f, 4, MPI_FLOAT, tempBuf, sizeof(tempBuf), &bufPos, MPI_COMM_WORLD );

MPI_Pack( s.c, 8, MPI_CHAR, tempBuf, sizeof(tempBuf), &bufPos, MPI_COMM_WORLD ); MPI_Send( tempBuf, bufPos, MPI_BYTE, targetRank, msgTag, MPI_COMM_WORLD );

Прием

int bufPos = 0;

char tempBuf[ sizeof(s) ];

MPI_Recv( tempBuf, sizeof(tempBuf), MPI_BYTE, sourceRank, msgTag, MPI_COMM_WORLD, &status ); MPI_Unpack( tempBuf, sizeof(tempBuf), &bufPos,&s.i, 1, MPI_INT, MPI_COMM_WORLD);

MPI_Unpack( tempBuf, sizeof(tempBuf), &bufPos, s.f, 4, MPI_FLOAT,MPI_COMM_WORLD);

MPI_Unpack( tempBuf, sizeof(tempBuf), &bufPos, s.c, 8, MPI_CHAR, MPI_COMM_WORLD);

Асинхронные операции

Функция приема-передачи не блокируется

Прием-передачу можно выполнять параллельно с обработкой данных

К передаваемым данным нельзя обращаться в процессе передачи-приема

Необходимо специально проверять завершение операции

Функции асинхронной передачи-приема

MPI_Isend (&buf,count,datatype,dest,tag,comm,&request)

MPI_Irecv (&buf,count,datatype,source,tag,comm,&request)

Все параметры аналогичные

Добавляется еще один

Статус выполнения запроса request

Проверка состояния

Проверка

MPI_Test(MPI_Request *req, int *flag, MPI_Status *stat)

Статус может быть MPI_STATUS_IGNORE

Ожидание завершения

MPI_Wait(MPI_Request *preq, MPI_Status *stat)

Ожидание завершения нескольких запросов

int MPI_Waitall(int count, MPI_Request *reqs, MPI_Status *stats)

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