Page 173 - 4868
P. 173
171 Ошибка! Стиль не определен.
extent(TypeMap) = ub(TypeMap)-lb(TypeMap).
Згідно з визначенням, нижня межа є зміщенням для першого байта
значень даного типу даних. Відповідно, верхня межа є зміщенням для байта,
розташованого вслід за останнім елементом даного типу даних. При цьому
величина зміщення для верхньої межі може бути закруглена вгору з
урахуванням вимог вирівнювання адрес. Так, одна з вимог, які накладають
деякі реалізації мов C, полягає в тому, щоб адреса елементу була кратна
довжині цього елементу у байтах. Наприклад, якщо тип int займає чотири
байти, то адреса елементу типу int повинна без остачі ділитися на чотири.
Саме ця вимога і відбивається у визначенні верхньої межі типу даних MPI.
Пояснимо цей момент на раніше розглянутому прикладі набору змінних a, b і
n, для якого нижня межа дорівнює 0, а верхня набуває значення 32 (величина
округлення 6 або 4 залежно від розміру типу int). Тут слід зазначити, що
необхідне вирівнювання визначається за типом першого елементу даних в
карті типу.
Слід також вказати на відмінність понять «протяжність» і «розмір типу».
Протяжність – це розмір пам’яті у байтах, який треба відводити для одного
елементу похідного типу. Розмір типу даних – це число байтів, які займають
дані (різниця між адресами останнього і першого байтів даних). Відмінність в
значеннях протяжності і розміру знову ж таки у величині округлення для
вирівнювання адрес. Так, в даному прикладі розмір типу дорівнює 28, а
протяжність – 32 (передбачається, що тип int займає чотири байти).
Для отримання значення протяжності типу в MPI передбачена функція:
int MPI_Type_extent(MPI_Datatype type, MPI_Aint *extent)
де
type – тип даних, протяжність якого визначається;
extent – протяжність типу.
Розмір типу можна знайти, використовуючи функцію:
int MPI_Type_size(MPI_Datatype type, MPI_Aint *size)
де
type – тип даних, розмір якого визначається;
size – розмір типу.
Визначення нижньої і верхньої границі типу може бути виконано за
допомогою функцій:
int MPI_Type_lb(MPI_Datatype type, MPI_Aint *disp)
та
int MPI_Type_ub(MPI_Datatype type, MPI_Aint *disp)
де
type – тип даних, нижня границя якого визначається;
disp – нижня/верхня границя типу.
Важливою і необхідною при конструюванні похідних типів є функція
отримання адреси змінної: