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 – нижня/верхня границя типу.
                     Важливою  і  необхідною  при  конструюванні  похідних  типів  є  функція
               отримання адреси змінної:
   168   169   170   171   172   173   174   175   176   177   178