Розшифрування типів даних

Next:MPI та тредиUp:Зовнішні інтерфейсиPrevious:Класи помилок, коди помилок &nbspContents

У MPI-1 реалізовані об'єкти, що є типами даних, які дозволяють користувачам вказувати спосіб розміщення даних у пам'яті. Інформація про розміщення, яка одного разу поміщена в тип даних, не може бути виділена з типу даних за допомогою функцій MPI-1. У ряді випадків, однак, хотілося б мати доступ до інформації про розміщення для прихованих об'єктів типів даних.

Дві функції, представлені в цій секції, використовуються спільно для розшифрування типів даних, щоб відновити послідовність дзвінків, використаних для початкового визначення. Вони можуть застосовуватися, щоб дозволити користувачеві визначити карту та тип сигнатури типу даних.

Для заданого типу даних MPI_TYPE_GET_ENVELOPE повертає інформацію про кількість та тип вхідних аргументів, використаних у виклику, який створив datatype . Повернені значення ``кількості аргументів'' можуть бути використані для реалізації досить великих масивів у підшифрованій підпрограмі MPI_TYPE_GET_CONTENTS . Цей виклик і значення даних, що повертаються, описані нижче. Combiner відображає конструктор типу даних MPI, який використовувався для створення datatype .

Пояснення:На вимогу, щоб комінер відобразив конструктор, використаний при створенні datatype , виходить розшифрована інформація, яка може використовуватися для ефективного відновлення послідовності викликів, використаних при початковому створенні. Здатність отримати початкову послідовність конструкторів вважається досить корисною для реалізацій з обмеженими ресурсами, в яких оптимізується внутрішнє уявлення типів даних для того, щобтакож пам'ятати початкову послідовність конструкторів.

Розшифрована інформація включає дані про дублювання типів даних. Це важливо, оскільки потреба відрізняти певний тип даних від копії цього типу. Перший - це постійний об'єкт, який не може бути звільнений, в той час як останній - це похідний тип даних, який може бути звільнений.

Рада користувачам:Розшифровка і потім повторне шифрування типів даних не обов'язково дадуть точну копію. Кешована інформація не відновлюється таким механізмом. Це має бути скопійована іншими методами (зважаючи на всі відомі ключі). Функція дублювання типу даних розділу 1-3.4.1 може використовуватися для отримання точної копії початкового типу даних.

Таблиця 6.1 містить значення, які можуть бути повернуті в combiner , зліва та пов'язані з ними виклики праворуч.

Якщо combiner - це MPI_COMBINER_NAMED , datatype - це ім'я визначеного типу даних.

Фактичні аргументи, використані під час виклику для створення datatype, можуть бути отримані за допомогою виклику:

datatype має бути визначеним неіменованим або похідним типом даних; виклик помилковий, якщо datatype є визначеним іменованим типом даних.

Значення, присвоєні max_integers , max_addresses , і max_datatypes повинні бути принаймні такого ж розміру, як і значення, повернене в num_integers , num_addresses , і num_datatypes , відповідно, при виклику MPI_TYPE_GET_EN.

Пояснення:Аргументи max_integers , max_addresses , і max_datatypes піддаються перевірці на помилки у виклику. Це відбувається аналогічно до аргументів у топології підпрограм MPI-1.

Типи даних, повернені в array_of_datatypes - це покажчики на об'єкти-типи даних, які еквівалентні типу даних, використаним в початковому конструювальному запиті. Якщо вони були похідними типами даних, то повернуті типи даних є новими об'єктами-типами даних, і користувач відповідальний за їхнє звільнення за допомогою MPI_TYPE_FREE . Якщо вони були визначеними типами даних, то повернутий тип даних еквівалентний визначеному і не може бути звільнений.

Переданий стан повернутих похідних типів даних невизначений; тобто типи даних можуть або не можуть бути передані. Крім того, і вміст атрибутів типів даних, що повертаються, невизначено.

Зверніть увагу на те, що MPI_TYPE_GET_CONTENTS може бути викликаний з аргументом datatype , який був сконструйований з використанням MPI_TYPE_CREATE_F90_REAL , MPI_TYPE_CREATE_F90_INTEGER або MPI_TYPE_CREATE_F90_COMPLEX. У такому разі повертається порожній array_of_datatypes .

Пояснення:Визначення еквівалентності типів даних передбачає, що визначені типи даних рівні. За потреби в однакових покажчиках для іменованих визначених типів даних можливе використання операторів порівняння = або .EQ. для визначення типу даних, що викликається. []

Рада розробникам:Типи даних, повернені в array_of_datatypes , повинні представлятися користувачеві так, ніби кожен із них - еквівалентна копія типу даних, використаного в конструюючому тип виклику. Зроблено це під час створення нового типу даних, чи з допомогою іншого механізму, подібного механізму підрахунку посилань, це вимагає виконання, поки семантика сохраняется.[]

Пояснення:Переданий стан та атрибути повернутого типу даних навмисно залишені невизначеними. Тип даних, що використовується в початковій конструкції, можливо, був змінений з того часу, коли він використовувався при виклику конструктора. Атрибути можуть бути додані, видалені або модифіковані також успішно, як факт передачі типу даних. Семантика дозволяє реалізації підраховувати посилання без вимоги відстежувати ці зміни. []

Далі наводяться визначення значень, які поміщаються в кожне поле масивів, що повертаються в залежності від конструктора, що використовується для типу даних. Також вказані необхідні розміри масивів, які є значеннями, що повертаються MPI_TYPE_GET_ENVELOPE . На ФОРТРАНe було зроблено такі запити:

Варіант аналогічного виклику на Сі:

Код на С++ аналогічний наведеному вище коду на Сі, з тими ж значеннями, що повертаються. В описах, які наведені нижче, використовуються ім'я аргументів із символів нижнього регістру. Якщо комбінер - це MPI_COMBINER_NAMED, то помилково викликати MPI_TYPE_GET_CONTENTS.