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 -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