Санкт-Петербургский государственный университет
Опубликован: 11.02.2010 | Доступ: свободный | Студентов: 530 / 93 | Оценка: 4.41 / 4.44 | Длительность: 08:19:00
Специальности: Программист
Лекция 3:

Интерфейс передачи сообщений 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 задается в байтах.

Векторный производный тип

Рис. 3.12. Векторный производный тип

Конструктор структурного типа

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 - тип элементов в каждом блоке (массив).

Выходной параметр:

  • newtype - идентификатор производного типа.

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 - базовый тип.

Выходной параметр:

  • newtype - идентификатор производного типа.

Конструктор типа данных, соответствующего подмассиву многомерного массива

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)

Выходной параметр:

  • displacement - смещение (в байтах) нижней границы относительно источника.

Определение верхней границы типа

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 - коммуникатор.