next up previous contents
Next: Упаковка и распаковка Up: Производные типы данных Previous: Примеры   Contents

Устаревшие функции

MPI-2 замещает некоторые функции конструирования и доступа, определенные в MPI-1, по следующим двум причинам.

Ниже дается список устаревших функций и констант MPI-1 с их определениями для языков Си и ФОРТРАН и приводится их замена. Как обычно устаревшие функции продолжают оставаться частью стандарта MPI, однако пользователю настоятельно рекомендуется использовать новые функции, где это возможно (см. раздел 1.9.1 о статусе устаревших функций).

MPI_TYPE_EXTENT(datatype, extent) int MPI_Type_extent (MPI_Datatype datatype, MPI_Aint *extent) MPI_TYPE_EXTENT (DATATYPE, EXTENT, ERROR) INTEGER DATATYPE, EXTENT, IERROR MPI_TYPE_LB(datatype, displacement) int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint* displacement) MPI_TYPE_LB (DATATYPE, DISPLACEMENT, IERROR) INTEGER DATATYPE, DISPLACEMENT, IERROR MPI_TYPE_UB (datatype, displacement) int MPI_Type_ub (MPI_Datatype datatype, MPI_Aint* displacement) MPI_TYPE_UB (DATATYPE, DISPLACEMENT, IERROR) INTEGER DATATYPE, DISPLACEMENT, IERROR

Эти три функции замещаются функцией MPI_TYPE_GET_EXTENT (datatype, extent, lb). Новая функция возвращает в одном вызове нижнюю границу и экстент типа данных, на основе которых может быть вычислена верхняя граница; в MPI-1 каждый из этих трех параметров возвращался отдельным вызовом. Более того, представление старых функций в языке ФОРТРАН указывает, что возвращаемое значение имеет тип INTEGER, в то время, как новая функция возвращает аргумент типа INTEGER (KIND=MPI_ADDRESS_KIND).

MPI_TYPE_HVECTOR(count, blocklength, stride, oldtype, newtype) int MPI_Type-hvector (int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_HVECTOR (COUNT, BLOCKLENGTH, STRIDE, OLDTYPE, NEWTYPE, IERROR) INTEGER COUNT, BLOCKLENGTH, STRIDE, OLDTYPE, NEWTYPE, IERROR

Функция MPI_TYPE_HVECTOR замещается функцией MPI_TYPE_CREATE_HVECTOR (count,
blocklength, stride, oldtype, newtype).
Нейтральное в отношении языка определение и вызов для языка Си - те же самые. Вызов для языка ФОРТРАН отличается в том, что старая функция использовала аргумент INTEGER STRIDE, а новая функция использует аргумент типа INTEGER (KIND=MPI_ADDRESS_KIND).

MPI_TYPE_HINDEXED(count, array_of_blocklengths, array_of_displacements, old_type, newtype) int MPI_Type_hindexed (int count, int *array_of_blocklengths, MPI_Aint *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_HINDEXED (COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, OLDTYPE, NEWTYPE, IERROR) INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS (*), ARRAY_OF_DISPLACEMENTS (*), OLDTYPE, NEWTYPE, IERROR

Эта функция замещается функцией MPI_TYPE_CREATE_HINDEXED(count,
array_of_blocklengths, array_ of_displacements, oldtype, newtype)
. Нейтральное определение и вызов для языка Си - те же самые. В языке ФОРТРАН для старой функции используется аргумент INTEGER ARRAY_OF_DISPLACEMENTS(*), а новая функция использует аргумент типа INTEGER (KIND=MPI_ADDRESS_KIND).

MPI_TYPE_STRUCT(count, array_of_blocklengths, array_of_displacements, array_of_types, newtype) int MPI_Type_struct (int count, int *array_of_blocklengths, MPI_Aint *array_of_displacements, MPI_Datatype *array_of_types, MPI_Datatype *newtype) MPI_TYPE_STRUCT(COUNT, ARRAY_OF_BLOCKLENGTHS, AR-RAY_OF_DISPLACEMENTS, ARRAY_OF_TYPES, NEWTYPE, IERROR) INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS (*), ARRAY_OF_DISPLACEMENTS), AR-RAY_OF-TYPES (*), NEWTYPE, IERROR

MPI_TYPE_STRUCT замещается функцией MPI_TYPE_CREATE_STRUCT(count,
array_of_blocklengths, array_of_displacements, array_of_types, newtype)
. В языке
ФОРТРАН старая функция использовала аргумент INTEGER ARRAY_OF_DISPLACEMENTS), а новая использует аргумент типа INTEGER(KIND=MPI_ADDRESS_KIND).

MPI_ADDRESS (location, address) int MPI_Address (void* location, MPI_Aint *address) MPI_ADDRESS (LOCATION, ADDRESS, IERROR) <type> LOCATION (*) INTEGER ADDRESS, IERROR

Эта функция замещается функцией MPI_GET_ADDRESS(location, address). Нейтральное языковое определение и обращение в языке Си - те же самые. В языке ФОРТРАН старая функция использовала аргумент INTEGER ADDRESS, а новая функция использует аргумент типа
INTEGER(KIND=MPI_ADDRESS_KIND).

Использование двух ``псевдотипов'' MPI_LB и MPI_UB замещается обращением к функции
MPI_TYPE_CREATE_RESIZED.

Пример 3.37 Рассмотрим последовательность вызовов в примере 3.22. Тогда первый вызов может быть заменен следующим эквивалентным (MPI-1) кодом.

MPI_Datatype types [3]; MPI_Aint disps [3]; int blens [3]; types [0] = MPI_LB; types [1] = MPI_UB; types [2] = type0; disps [0] = -4; disps [1] = 8; disps [2] = 0; blens [0] = blens [1] = blens [2] = 1; MPI_Type_struct (3, blens, disps, types, &type l);

Кода, эквивалентного второму обращению к MPI_TYPE_CREATE_RESIZED, в MPI-1 не имеется. Это происходит, потому что этот вызов перемещает существующий маркер MPI_LB вверх, что не может быть сделано в MPI-1.

Ниже дается синтаксис ряда новых функций.

Синтаксис функции MPI_TYPE_CREATE_HVECTOR представлен ниже.

MPI_TYPE_CREATE_HVECTOR(count, blocklength, stride, oldtype, newtype)

IN count число блоков (неотрицательное целое)
IN blocklength число элементов в каждом блоке (неотрицательное целое)
IN stride число байтов между началом каждого блока (целое)
IN oldtype старый тип (дескриптор)
OUT newtype новый тип (дескриптор)

int MPI_Type_create_hvector (int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_CREATE_HVECTOR(COUNT, BLOCKLENGTH, STIDE, OLDTYPE, NEWTYPE, IERROR) INTEGER COUNT, BLOCKLENGTH, OLDTYPE, NEWTYPE, IERROR INTEGER(KIND=MPI_ADDRESS_KIND) STRIDE MPI::Datatype MPI::Datatype::Create_hvector(int count, int blocklength, MPI::Aint stride) const

Синтаксис функции MPI_TYPE_CREATE_HINDEXED представлен ниже.

MPI_TYPE_CREATE_HINDEXED(count, array_of_blocklengths, array_of_displacements, oldtype, newtype)

IN count число блоков (целое)
IN array_of_blocklengths число элементов в каждом блоке (массив целых)
IN array_of_displacements смещение каждого блока в байтах (массив целых)
IN oldtype старый тип (дескриптор)
OUT newtype новый тип (дескриптор)

int MPI_Type_create_hindexed(int count, int array_of_blocklengths[], MPI_Aint array_of_displacements[], MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_CREATE_HINDEXED(COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, OLDTYPE, NEWTYPE, IERROR) INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*), OLDTYPE, NEWTYPE, IERROR INTEGER(KIND=MPI_ADDRESS_KIND) ARRAY_OF_DISPLACEMENTS(*) MPI::Datatype MPI::Datatype::Create_hindexed(int count, const int array_of_blocklengths[], const MPI::Aint array_of_displacements[]) const

Синтаксис функции MPI_TYPE_CREATE_STRUCT представлен ниже.

MPI_TYPE_CREATE_STRUCT(count, array_of_blocklengths, array_of_displacements, array_of_types, newtype)

IN count число блоков (целое)
IN array_of_blocklength число элементов в каждом блоке (массив целых)
IN array_of_displacements смещение каждого блока в байтах (массив целых)
IN array_of_types тип элементов каждого блока (массив дескрипторов для объектов типа данных)
OUT newtype новый тип (дескриптор)

int MPI_Type_create_struct(int count, int array_of_blocklengths[], MPI_Aint array_of_displacements[], MPI_Datatype array_of_types[], MPI_Datatype *newtype) MPI_TYPE_CREATE_STRUCT(COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS, ARRAY_OF_TYPES, NEWTYPE, IERROR) INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*), ARRAY_OF_TYPES(*), NEWTYPE, IERROR INTEGER(KIND=MPI_ADDRESS_KIND) ARRAY_OF_DISPLACEMENTS(*) static MPI::Datatype MPI::Datatype::Create_struct( int count, const int array_of_blocklengths[], const MPI::Aint array_of_displacements[], const MPI::Datatype array_of_types[])

Синтаксис функции MPI_GET_ADDRESS представлен ниже.

MPI_GET_ADDRESS(location, address)

IN location ячейка в памяти (альтернатива)
OUT address адрес ячейки (целое)

int MPI_Get_address(void *location, MPI_Aint *address) MPI_GET_ADDRESS(LOCATION, ADDRESS, IERROR) <type> LOCATION(*) INTEGER IERROR INTEGER(KIND=MPI_ADDRESS_KIND) ADDRESS MPI::Aint MPI::Get_address(void* location)

Совет пользователям: Существующие программы MPI для языка ФОРТРАН будут выполняться не модифицированными и будут подходить к любой системе. Однако, они могут не выполняться, если в программе используются адреса больше, чем 2$^{32}$ -1. Новые программы с новыми функциями преодолевают этот недостаток, они также обеспечивают совместимость с языками Си/С++. Однако, вновь написанные программы могут потребовать небольшой переделки для совместимости со старой средой ФОРТРАН77, которая не поддерживает декларации KIND.[]

Синтаксис функции MPI_TYPE_GET_EXTENT представлен ниже. MPI_TYPE_GET_EXTENT(datatype, lb, extent)

IN datatype тип данных (дескриптор)
OUT lb нижняя граница типа (целое)
OUT extent экстент типа данных (целое)

int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint *lb, MPI_Aint *extent) MPI_TYPE_GET_EXTENT(DATATYPE, LB, EXTENT, IERROR) INTEGER DATATYPE, IERROR INTEGER(KIND = MPI_ADDRESS_KIND) LB, EXTENT void MPI::Datatype::Get_extent(MPI::Aint& lb, MPI::Aint& extent) const

Синтаксис функции MPI_TYPE_CREATE_RESIZED представлен ниже.

MPI_TYPE_CREATE_RESIZED(oldtype, lb, extent, newtype)

IN oldtype входной тип данных (дескриптор)
IN lb новая нижняя граница типа данных (целое)
IN extent новый экстент типа данных (целое)
OUT newtype выходной тип данных (дескриптор)

int MPI_Type_create_resized(MPI_Datatype oldtype, MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype) MPI_TYPE_CREATE_RESIZED(OLDTYPE, LB, EXTENT, NEWTYPE, IERROR) INTEGER OLDTYPE, NEWTYPE, IERROR INTEGER(KIND=MPI_ADDRESS_KIND) LB, EXTENT MPI::Datatype MPI::Datatype::Resized(const MPI::Aint lb, const MPI::Aint extent) const


next up previous contents
Next: Упаковка и распаковка Up: Производные типы данных Previous: Примеры   Contents
Alex Otwagin 2002-12-10