Разбиране на типовете данни

Следващ:MPI и нишкиНагоре:Външни интерфейсиПредишен:Класове грешки, кодове на грешки &nbspСъдържание

MPI-1 имплементира обекти, които са типове данни, които позволяват на потребителите да определят как данните се съхраняват в паметта. Информацията за разпределение, веднъж поставена в тип данни, не може да бъде извлечена от типа данни с помощта на MPI-1 функции. В някои случаи обаче човек би искал да има достъп до информация за местоположението за типове данни за скрити обекти.

Двете функции, представени в този раздел, се използват заедно за декодиране на типове данни, за да се възстанови последователността от извиквания, използвани за първоначалното им дефиниране. Те могат да се използват, за да позволят на потребителя да посочи картата и типа на подписа на типа данни.

При даден тип данни, MPI_TYPE_GET_ENVELOPE връща информация за броя и типа на входните аргументи, използвани в извикването, което е създало типа данни. Върнатите стойности на `` брой аргументи '' могат да се използват за прилагане на достатъчно големи масиви в рутинната декриптираща програма MPI_TYPE_GET_CONTENTS. Това повикване и значението на върнатите данни са описани по-долу. combiner показва конструктора на MPI тип данни, който е бил използван за създаване на типа данни.

Обяснение:При поискване, за да може комбинаторът да картографира конструктора, използван за създаване на типа данни, се получава декодирана информация, която може да се използва за ефективно възстановяване на последователността от извиквания, използвани при първоначалното създаване. Възможността за извличане на първоначалната последователност от конструктори се счита за доста полезна за реализации с ограничени ресурси, които оптимизират вътрешното представяне на типове данни, за дасъщо запомнете началната последователност от конструктори.

Дешифрираната информация включва данни за дублиране на типове данни. Това е важно, защото е необходимо да се прави разлика между предварително дефиниран тип данни и копие от този тип. Първият е постоянен обект, който не може да бъде освободен, докато вторият е производен тип данни, който може да бъде освободен.

Съвет за потребителите:Декриптирането и след това повторното криптиране на типове данни няма непременно да произведе точно копие. Кешираната информация не се възстановява от този механизъм. Трябва да се копира с други методи (като се вземат предвид всички известни ключове). Функцията за дублиран тип данни от раздел 1-3.4.1 може да се използва за получаване на точно копие на оригиналния тип данни.

Таблица 6.1 съдържа стойностите, които могат да бъдат върнати в комбинатор отляво и свързаните с тях извиквания отдясно.

Ако combiner е MPI_COMBINER_NAMED, тогава datatype е името на предварително дефиниран тип данни.

Действителните аргументи, използвани в повикването за създаване на типа данни, могат да бъдат получени чрез извикване:

типът данни трябва да бъде предварително дефиниран ненаименован или производен тип данни; извикването е неуспешно, ако типът данни е предварително дефиниран тип данни.

Стойностите, присвоени на max_integers, max_addresses и max_datatypes, трябва да бъдат поне със същия размер като стойността, върната съответно в num_integers, num_addresses и num_datatypes, когато се извиква MPI_TYPE_GET_ENVELOPE със същия аргумент тип данни.

Обяснение:Аргументите max_integers, max_addresses и max_datatypes подлежат на проверка за грешки в извикването. Това се случва по подобен начин за аргументи в топологията на рутинни процедури MPI-1.

Типовете данни, върнати в array_of_datatypes, са указатели към обекти от тип данни, които са еквивалентни на типовете данни, използвани в оригиналната заявка за конструиране. Ако те са били производни типове данни, тогава върнатите типове данни са нови обекти от типове данни и е отговорност на потребителя да ги освободи с MPI_TYPE_FREE. Ако са били предварително дефинирани типове данни, тогава върнатият тип данни е еквивалентен на предварително дефинирания и не може да бъде освободен.

Предаденото състояние на върнатите производни типове данни е недефинирано; т.е. типовете данни могат или не могат да бъдат предавани. В допълнение, съдържанието на атрибутите на върнатите типове данни е недефинирано.

Обърнете внимание, че MPI_TYPE_GET_CONTENTS може да бъде извикан с аргумент за тип данни, който е конструиран с помощта на 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. Във FORTRAN бяха направени следните заявки:

Вариант на подобно извикване в C:

C++ кодът е подобен на C кода по-горе, със същите върнати стойности. Описанията, които следват, използват името на аргумента с малки букви. Ако комбинаторът е MPI_COMBINER_NAMED, тогава е грешка да се извика MPI_TYPE_GET_CONTENTS.