Page 172 - 4868
P. 172
Ошибка! Стиль не определен. 170
представлений в табл. 2.2). Зрозуміло, що в загальному випадку необхідні до
пересилки дані можуть поруч не розташовуватися і складатися із значень
різних типів. Звичайно, і в цих ситуаціях розрізнені дані можуть бути
передані з використанням декількох повідомлень, але такий спосіб
неефективний в силу накопичення латентностей множини виконуваних
операцій передачі даних. Інший можливий підхід полягає в попередній
упаковці даних, що передаються у формат певного вектору, проте і тут
з’являються зайві операції копіювання даних, та і зрозумілість таких
операцій передачі далека від бажаної.
Для забезпечення додаткових можливостей при визначенні складу
повідомлень, що передаються в MPI передбачений механізм так званих
похідних типів даних.
У найзагальнішому вигляді під похідним типом даних в MPI можна
розуміти опис набору значень передбаченого в MPI типу, причому в
загальному випадку описувані значення не обов’язково безперервно
розташовуються в пам’яті. Задання типу в MPI прийнято здійснювати за
допомогою карти типу (type map) у вигляді послідовності описів значень,
що входять в тип; кожне окреме значення описується вказуванням типу і
зміщення адреси місцерозташування від деякої базової адреси, тобто
TypeMap = {(type 0, disp 0),...,(type n-1, disp n-1)}.
Частина карти типу з вказуванням тільки типів значень називається в
MPI сигнатурою типу:
TypeSignature ={type 0,...,type n-1}.
Сигнатура типу описує, які базові типи даних утворюють деякий
похідний тип даних MPI, і, тим самим, управляє інтерпретацією елементів
даних при передачі або отриманні повідомлень. Зміщення карти типу
визначають, де знаходяться значення даних.
Пояснимо розглянуті поняття на наступному прикладі. Нехай в
повідомлення повинні входити значення змінних:
double a; /* адрес 24 */
double b; /* адрес 40 */
int n; /* адрес 48 */
Тоді похідний тип для опису таких даних повинен мати карту типу
наступного виду:
{(MPI_DOUBLE, 0), (MPI_DOUBLE, 16), (MPI_INT, 24)}
Додатково для похідних типів даних в MPI використовується наступний
ряд нових понять:
нижня границя типу:
lb(TypeMap) = min j(disp j);
верхня границя типу:
ub(TypeMap) = max j(disp j+sizeof(type j))+Δ;
протяжність типу:.