Четыре приведенные функции дополняют функции создания типов из MPI-1. Новые функции - синонимы старых для Си/С++, или систем ФОРТРАН, где INTEGER по умолчанию имеет размер адреса. (Старые имена в С++ недоступны.) В ФОРТРАН эти функции принимают аргументы типа INTEGER(KIND=MPI_ADDRESS_KIND) там, где в Си используются аргументы типа MPI_Aint. В системах ФОРТРАН77, не поддерживающих нотацию KIND из ФОРТРАН90 и там, где адрес имеет размер 64 бита при 32-х битном INTEGER по умолчанию, эти аргументы будут иметь тип INTEGER*8. Старые функции будут сохранены для обратной совместимости. Тем не менее, пользователи должны перейти на новые функции - как в Си, так и в ФОРТРАНe.
Ниже описаны новые функции. Использование старых функций не поощряется.
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( count, array_of_blocklengths,
array_of_displacements, oldtype, newtype)
IN | count | количество блоков -- также число меток в array_of_displacements и array_of_blocklengths (целое) | |
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(count, array_of_blocklengths,
array_of_displacements, array_of_types, newtype)
IN | count | количество блоков -- также число меток в array_of_displacements и array_of_blocklengths | |
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(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 должен работать без
изменений, и может быть перенесён в любую систему. Тем не менее, он может не
работать, если в программе использованы адреса больше чем -1. Новый
код должен использовать новые функции. Это даёт совместимость с
Си/С++ и позволяет избегать ошибок в 64-битных архитектурах. Несмотря
на это, такой код может потребовать небольшого изменения для совместимости со
старым ФОРТРАН77, не поддерживающим объявления KIND. []