Интерфейс передачи сообщений MPI
Производные типы
Производные типы данных MPI используются для пересылки данных, элементы которых располагаются в памяти не подряд, а с "пробелами". Производный тип сначала создается с помощью вызова подпрограммы-конструктора, а потом регистрируется. Перед завершением программы производный тип должен быть удален.
Конструктор векторного типа
int MPI_Type_vector(int count, int blocklen, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_VECTOR(COUNT, BLOCKLEN, STRIDE, OLDTYPE, NEWTYPE, IERR)
Входные параметры:
- count - количество блоков (неотрицательное целое значение);
- blocklen - длина каждого блока (количество элементов, неотрицательное целое);
- stride - количество элементов, расположенных между началом предыдущего и началом следующего блока ("гребенка");
- oldtype - базовый тип.
Выходной параметр:
- newtype - идентификатор нового типа, который назначается программистом.
Исходные данные однотипные.
Конструктор векторного типа (рис. 3.12)
int MPI_Type_hvector(int count, int blocklen, MPI_Aint stride, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_HVECTOR(COUNT, BLOCKLEN, STRIDE, OLDTYPE, NEWTYPE, IERR)
Смысл и назначение параметров этой подпрограммы совпадают с подпрограммой MPI_Type_vector, только значение параметра stride задается в байтах.
Конструктор структурного типа
int MPI_Type_struct(int count, int blocklengths[], MPI_Aint indices[], MPI_Datatype oldtypes[], MPI_Datatype *newtype) MPI_TYPE_STRUCT(COUNT, BLOCKLENGTHS, INDICES, OLDTYPES, NEWTYPE, IERR)
Входные параметры:
- count - задает количество элементов в производном типе, а также длину массивов
- oldtypes, indices и blocklengths ;
- blocklengths - количество элементов в каждом блоке (массив);
- indices - смещение каждого блока в байтах (массив);
- oldtypes - тип элементов в каждом блоке (массив).
Выходной параметр:
MPI_Aint - представляет собой скалярный тип, длина которого имеет размер, одинаковый с указателем.
Конструктор индексированного типа
int MPI_Type_indexed(int count, int blocklens[], int indices[], MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_INDEXED(COUNT, BLOCKLENS, INDICES, OLDTYPE, NEWTYPE, IERR)
Входные параметры:
- count - количество блоков, одновременно длина массивов indices и blocklens ;
- blocklens - количество элементов в каждом блоке;
- indices - смещение каждого блока, которое задается в количестве ячеек базового типа (целочисленный массив);
- oldtype - базовый тип. Выходной параметр:
- newtype - идентификатор производного типа.
Конструктор индексированного типа
int MPI_Type_hindexed(int count, int blocklens[], MPI_Aint indices[], MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_HINDEXED(COUNT, BLOCKLENS, INDICES, OLDTYPE, NEWTYPE, IERR)
Смещения indices задаются в байтах:
Конструктор типа данных с непрерывным расположением элементов
int MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_CONTIGUOUS(COUNT, OLDTYPE, NEWTYPE, IERR)
Входные параметры:
- count - счетчик повторений;
- oldtype - базовый тип
Выходной параметр:
- newtype - идентификатор нового типа.
Конструктор индексированного типа с блоками постоянного размера
int MPI_Type_create_indexed_block(int count, int blocklength, int displacements[], MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_CREATE_INDEXED_BLOCK(COUNT, BLOCKLENGTH, DISPLACEMENTS, OLDTYPE, NEWTYPE, IERR)
Входные параметры:
- count - количество блоков и размер массивов indices и blocklens ;
- blocklength - количество элементов в каждом блоке;
- displacements - смещение каждого блока в единицах длины типа oldtype (целочисленный массив);
- oldtype - базовый тип.
Выходной параметр:
Конструктор типа данных, соответствующего подмассиву многомерного массива
int MPI_Type_create_subarray(int ndims, int *sizes, int *subsizes, int *starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_CREATE_SUBARRAY(NDIMS, SIZES, SUBSIZES, STARTS, ORDER, OLDTYPE, NEWTYPE, IERR)
Входные параметры:
- ndims - размерность массива;
- sizes - количество элементов типа oldtype в каждом измерении полного массива;
- subsizes - количество элементов типа oldtype в каждом измерении подмассива;
- starts - стартовые координаты подмассива в каждом измерении;
- order - флаг, задающий переупорядочение;
- oldtype - базовый тип.
Выходной параметр:
- newtype - новый тип.
Регистрация производного типа datatype, сконструированного программистом
int MPI_Type_commit(MPI_Datatype *datatype) MPI_TYPE_COMMIT(DATATYPE, IERR)
Удаление производного типа datatype
int MPI_Type_free(MPI_Datatype *datatype) MPI_TYPE_FREE(DATATYPE, IERR)
Базовые типы данных не могут быть удалены.
Определение размера типа datatype в байтах (объем памяти, занимаемый одним элементом данного типа)
int MPI_Type_size(MPI_Datatype datatype, int *size) MPI_TYPE_SIZE(DATATYPE, SIZE, IERR)
Выходной параметр - размер size.
Определение количества элементов данных в одном объекте типа datatype (его экстент)
int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent) MPI_TYPE_EXTENT(DATATYPE, EXTENT, IERR)
Выходной параметр - extent.
Смещения могут даваться относительно базового адреса, значение которого содержится в константе MPI_BOTTOM.
Определение адреса (address) по заданному положению (location)
int MPI_Address(void *location, MPI_Aint *address) MPI_ADDRESS(LOCATION, ADDRESS, IERR)
Может использоваться в программах на языках C и FORTRAN. В C она обычно возвращает тот же адрес, что и оператор &, хотя иногда это не так. Данная подпрограмма может понадобиться в программе на языке FORTRAN, в C есть собственные средства для определения адреса.
Определение фактических параметров, использованных при создании производного типа
int MPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses, int max_datatypes, int *integers, MPI_Aint *addresses, MPI_Datatype *datatypes) MPI_TYPE_GET_CONTENTS(DATATYPE, MAX_INTEGERS, MAX_ADDRESSES, MAX_DATATYPES, INTEGERS, ADDRESSES, DATATYPES, IERR)
Входные параметры:
- datatype - идентификатор типа;
- max_integers - количество элементов в массиве integers ;
- max_addresses - количество элементов в массиве addresses ;
- max_datatypes - количество элементов в массиве datatypes.
Выходные параметры:
- integers - содержит целочисленные аргументы, использованные при конструировании указанного типа;
- addresses - содержит аргументы address, использованные при конструировании указанного типа;
- datatypes - содержит аргументы datatype, использованные при конструировании указанного типа.
Определение нижней границы типа данных datatype
int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint Misplacement) MPI_TYPE_LB(DATATYPE, DISPLACEMENT, IERR)
Выходной параметр:
Определение верхней границы типа
int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint Misplacement) MPI_TYPE_UB(DATATYPE, DISPLACEMENT, IERR)
Упаковка данных
int MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, int outcount, int *position, MPI_Comm comm) MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTCOUNT, POSITION, COMM, IERR)
При вызове incount элементов указанного типа выбираются из входного буфера и упаковываются в выходном буфере, начиная с положения position.
Входные параметры:
- inbuf - начальный адрес входного буфера;
- incount - количество входных данных;
- datatype - тип каждого входного элемента данных;
- outcount - размер выходного буфера в байтах;
- position - текущее положение в буфере в байтах;
- comm - коммуникатор для упакованного сообщения.
Выходной параметр:
- outbuf - стартовый адрес выходного буфера.
Распаковка данных
int MPI_Unpack(void *inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm) MPI_UNPACK(INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE, COMM, IERR)
Входные параметры:
- inbuf - стартовый адрес входного буфера;
- insize - размер входного буфера в байтах;
- position - текущее положение в байтах;
- outcount - количество данных, которые должны быть распакованы;
- datatype - тип каждого выходного элемента данных;
- comm - коммуникатор для упаковываемого сообщения.
Выходной параметр:
- outbuf - стартовый адрес выходного буфера.
Определение объема памяти size (в байтах), необходимого для распаковки сообщения
int MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size) MPI_PACK_SIZE(INCOUNT, DATATYPE, COMM, SIZE, IERR)
Входные параметры:
- incount - аргумент count, использованный при упаковке;
- datatype - тип упакованных данных;
- comm - коммуникатор.