Часто удобно явно указать нижнюю и верхнюю границы карты типа. Это позволяет определить тип данных, который имеет ``дыры'' в начале или конце, или тип с элементами, которые идут выше верхней или ниже нижней границы. Пример такого использования представлен в разделе 3.12.7. Пользователь также может пожелать обойти правила выравнивания для некоторых структур внутри программ. Пользователь может явно описать границы типа данных, которые соответствуют этим структурам.
Чтобы достичь этого, вводятся два дополнительных ``псевдо-типа данных'': MPI_LB и MPI_UB, которые могут быть использованы соответственно для маркировки нижней и верхней границ типа данных. Эти псевдотипы не занимают места (экстент(MPI_LB)= экстент (MPI_UB)= 0). Они не меняют size или count типа данных и не влияют на содержание сообщения, созданного с этим типом данных. Однако они влияют на определение экстента типа данных и, следовательно, влияют на результат репликации этого типа данных конструктором типа данных.
Пример 3.26 Пусть D = (-3, 0, 6); T = (MPI_LB, MPI_INT, MPI_UB), и B = (1, 1, 1). Тогда обращение к MPI_TYPE_STRUCT(3, B, D, T, type1) создает новый тип данных, который имеет экстент величиной 9 (от -3 до 5, 5) и содержит целое значение на смещении 0. Это тип данных, определенный последовательностью {(lb, -3), (int, 0), (ub, 6)}. Если этот тип повторяется дважды вызовом MPI_TYPE_CONTIGUOUS(2, type1, type2), тогда вновь созданный тип может быть описан последовательностью {(lb, -3), (int, 0), (int,9), (ub, 15)}. (Входной тип ub может быть удален, если имеется другой входной тип ub с более высоким смещением; входной тип lb может быть удален, если имеется другой входной тип lb с более низким смещением).
Две функции ниже могут быть использованы для нахождения нижней и верхней границ типа данных.
Синтаксис функции MPI_TYPE_LB представлен ниже.
MPI_TYPE_LB(datatype, displacement)
IN | datatype | тип данных (дескриптор) | |
OUT | displacement | смещение нижней границы от исходной в байтах (целое) |
int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint* displacement)
MPI_TYPE_LB(DATATYPE, DISPLACEMENT, IERROR)
INTEGER DATATYPE, DISPLACEMENT, IERROR
Синтаксис функции MPI_TYPE_UB представлен ниже.
MPI_TYPE_UB(datatype, displacement)
IN | datatype | тип данных (дескриптор) | |
OUT | displacement | смещение верхней границы от исходной в байтах (целое) |
int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint* displacement)
MPI_TYPE_UB(DATATYPE, DISPLACEMENT, IERROR)
INTEGER DATATYPE, DISPLACEMENT, IERROR