Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Производные типы

Производные типы данных 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 - коммуникатор.
<== предыдущая лекция | следующая лекция ==>
Топологии | Атрибуты. Механизм назначения атрибутов является дополнительным средством обмена информацией между процессами
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 333; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.