Page 220 - 6571
P. 220
Пояснимо розглянуті поняття на наступному прикладі. Нехай
в повідомлення повинні входити значення змінних:
double a; /* адрес 24 */
double b; /* адрес 40 */
int n; /* адрес 48 */
Тоді похідний тип для опису таких даних повинен мати карту
типу наступного виду:
{(MPI_DOUBLE, 0), (MPI_DOUBLE, 16), (MPI_INT, 24)}
Додатково для похідних типів даних в MPI використовується
наступний ряд нових понять:
- нижня границя типу:
lb(TypeMap) = min (disp );
j
j
- верхня границя типу:
ub(TypeMap) = max (disp +sizeof(type ))+Δ;
j
j
j
- протяжність типу:.
extent(TypeMap) = ub(TypeMap)-lb(TypeMap).
Згідно з визначенням, нижня межа є зміщенням для першого
байту значень даного типу даних. Відповідно, верхня межа є змі-
щенням для байту, розташованого вслід за останнім елементом
даного типу даних. При цьому величина зміщення для верхньої
межі може бути закруглена вгору з урахуванням вимог вирівню-
вання адрес. Так, одна з вимог, які накладають деякі реалізації
мов C, полягає в тому, щоб адреса елементу була кратна довжині
цього елементу у байтах. Наприклад, якщо тип int займає чоти-
ри байти, то адреса елементу типу int повинна без остачі діли-
тися на чотири. Саме ця вимога і відбивається у визначенні верх-
ньої межі типу даних MPI. Пояснимо цей момент на раніше розг-
лянутому прикладі набору змінних a, b і n, для якого нижня межа
дорівнює 0, а верхня набуває значення 32 (величина округлення
6 або 4 залежно від розміру типу int). Тут слід зазначити, що
необхідне вирівнювання визначається за типом першого елемен-
ту даних в карті типу.
Слід також вказати на відмінність понять «протяжність» і
«розмір типу». Протяжність – це розмір пам’яті у байтах, який
треба відводити для одного елементу похідного типу. Розмір типу
даних – це число байтів, які займають дані (різниця між адресами
останнього і першого байтів даних). Відмінність в значеннях про-
219