В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 37
Текст из файла (страница 37)
7.3.8. Структурный строитель типов данных втиОСт МР1 ТУРЕ БТЕВСТ(сопит, аггау о1 ЫосК?епйгйз, аггау о1 ()1зр?асешептз, аггау от сурен, пенсуре) количество блоков количество элементов в каждан блоке смешения каждого блока, измеряемые в байтах тины элементов в каждом блоке новый тип данных 1И соппс 1М аггау оТ ЫосК1епйкйз 1М агтау от 6?зр1асешепсз 1М аггау от курев ООТ пеысуре 1пС МР1 Туре зггпсг(1пС сопит, 1пг еаггау оу Ыосй?епЕСйз, МР1 Агпс еагтау„от (?1зр1асешепсз,МР? 0асасуре еаггау от сурен, МР1 Оасасуре епеысуре) МР1 ТУРЕ ЯТВВСТ(СООИТ, АНВАУ ОР В?.ОСК?.ЕИСТНБ, АВЕАУ ОГ 0?БР?.АСЕМЕМТЯ, АВВАУ ОГ ТУРЕЯ, МЕМТУРЕ, ?ЕВВОВ) ?МТЕОЕВ СООМТ, АВВАУ ОР В?.ОСК?.ЕМОТНБ(е), АВВАУ„ОГ 0?БРьАСЕМЕМТБ(е) 1ИТЕСЕВ АВВАУ ОР ТУРЕБ(е), МЕМТУРЕ, ?ЕВВОВ МР1 ТУРЕ БТВОСТ вЂ” наиболее общий строитель тина.
Он обобщает МР1 ТУРЕ Н?МВЕХМ) и допускает, чтобы каждый блок состоял из дублирований различного типа данных. Ди этого имеется массив для описания типов элементов для каждого блока. Действие Бстась строителя представлено схематично на рис. 7.9. Пример 7.12. Здесь используются те же самые аргументы функции МР1 ТУРЕ 1МОЕХЕО, как в примере 7.11. Таким образом, о1()суре имеет отображение типа ((е?опЫе, 0),(сйаг, 8)] с диапазоном 16, В=(3,1) и 0=(4,0). Запрос к МР1 ТУРЕ Н?МВЕХЕ0(2, В,0, о1бсуре,пеысуре) возвращает следуюц?ее отображение типа: уз'. Строители типов 143 о1о»уре соип» 3, ЫосХ1ецпоь (2, 3, 4), Н(вр1есеиеи» (О, 7, 16) цеисуре Рис.
7.9. Построение типа данных функцией строителя типов МР1 ТУРЕ ЯТВОСТ Пример 7.13. Лопустим, ъуре1 имеет отображение типа ((с(опЫе, О), (сЬаг,8) ) с диа- ппзоном 16. Лопустим, В=(2,1,3), 0=(0,16,26) и Т=(МР1 р1ОАТ,суре1,МР1 СНАМ). Тогда вызов МР1 ТУРЕ ЯТВОСТ(3, В, О,Т, пенсуре) построит новый тип с отображением: ((11оас, О), (11оас,4), (с(оцЫе, 16), (сЬаг,24), (сЬаг,26), (сЬаг,27), (сЬэг,28)) ((суреоО, с(з.зроО+ 0[0]),.-, (суреопо, с(ззропо+ 0[0]), -, (СуреоО, с(звроО+ 0[О]+ (В[0] — 1) «ехо), ..., (Суреопо, с(ззропо+ 0[О]+ (В[0] — 1):» ехо), ".
(суре, 10,()тврс (О+0[с — 1]),...,(курос (пс ( — 1,((ззрс (п, 1 — 1+ 0[с — 1]),..., (СУРЕс 10,((тзРс 10+0[С вЂ” 1]+(В[С вЂ” 1] — 1) *ЕХс 1),..., (СУРЕс (пс 1 — 1,с(звРс (пс ) — 1+ 0[с — 1]+ (В[с — 1] — 1) «ехс 1)). Запрос к МР1 ТУРЕ Н1МОЕХЕО(соппс, В, О, о1()суре, центури) эквивалентен запросу к иР1 туре ЯтБОст(соцпс, В, О, т, пенсуре), где каждый элемент в т равен о16суре. Пример 7.14. Посылка массива структур.
Ипгпсс Рагсзсгпсс сЬаг с1авз, ооцЫе с)(63, сЬаг Ьс73, ппгпсс Рагсвсгпсс рагсзс1е(10003, )пс з, с(евс, галй, ИР1 Соаа сова, (» Построение типа данных, опнсываюших структуру «/ ИР1 Оасасуре Рагсзс1есуре, ИР1 Оатапуре Суре(3) = (МР1 СНАМ, МР1 ПСОВОЕ, МР1 СНАМ), )пс ЫосК1еп(3) = (1,6,7), ИР1 Азпп с(звр(3) = (О, ззхеоХ(боцЫе), 7«взхео1(с(оцЫе)), ИР1 Туре всгцсс(3, ЫосК1еп, оъвр, суре, вРагсзс1есуре), ИР1 Туре соаатс(йрагстс1есуре), /» Послать массив «/ ИР1 Яеп(1(рагсзс1е, 1000, Рагстс1есуре, йенс, саЕ, соппп), /« класс частицы «/ /« координаты частицы «/ /« некоторая другая информация «/ Здесь две копии МР1 Р1ОАТ имеют смещение О, далее одна копия суре1 имеет смешение 16, три копии МР1 СНАМ имеют смешение 26.
(Здесь предполагается, что 41оас занимает петыре байта.) Вообще, допустим, Т есть массив аргументов аггау оУ курев, где Т[з3 — заголовок П гурЕаарп оо ((СУРЕ(0,ОЗзр,О), ...,(СурЕ,П, (,С(тзр,лп З)) С дИаПаЗОНОМ ЕХЗ. ЛОПуСтИМ, И есть аргумент аггау ог ЫосК1епйсЬ и 0 есть аргумент аггау ой с(ззр1асеаепсз. Ло-. пустим, С есть аргумент соцпп. Тогда построенный тип данных имеет отображение с с-1 В[з] «и элементами: »оо 144 У Опуеде»лемме аохьаоеатиелем шизы данных а уаааоеаа даинмх /» тип данных, описывавший все частицы »/ /» с нулевым классом (должен быть »/ /* повторно вычислен, если классы изменены) »/ МР1 Азпс »хбззр, п~ »хЫосК1еп, МР1 Туре зпгисп(3, ЫосК1еп, бззр, Суре, ФРагпзс1епуре), МР1 Соппп гап1с(соппп, йшугапК), з1(шугапК == 0) ( /» Передача сообшения, состояшее из всех частиц нулевого класса »/ /» Нахождение типов данных структуры для создаваемых типов данных »/ мР1 туре ехсепс(мр1 Азпс, йззгеазпс), хбтзр = (МР1 Азпс»)ва11ос(1000»ззхеатпс), хЫосК1еп = (зпс»)ша11ос(1000»зъяеоХ(дпс)), /» Вычисление смешений частип нулевого класса »/ ) =о, аког(т=О, т<1000, т++) зХ(рагсзс1еЫ с1азз =0) ( гбтзр[)) хЫосК1еп[)1 = 1, д++, /» Создание типа данных дпя частиц нулевого класса »/ МР1 Туре гпбехеб(), хЫосК1еп, кбтзр, Рагстс1есуре, йЕрагсзс1ез), МР1 Туре сошшзс(а2рагстс1ез), /» Передача »/ МР1 Бепб(рагстс1е, 1, Ерагсзс1ез, 1, 0„ сопи), е1зе ( т1(шугапК==1) /» Прием частиц нулевого класса в поле памяти »/ МР1 Несу(рагпзс1е, 1000, Рагсзс1епуре„ О, О, соппп, йзпаппз), Массив бззр был инициализирован в предположении, что боцЫе является выравненным двойным словом.
Если боиЫе'з являются единственным выровненным словом, то бзпр был инициализирован к (О, ззхеоХ (зпс), зткео1(~пс)+б»зтяеоХ(боиЫе) ). В примере 7 21, показывается, как избежать этой зависимости от машины. Пример 7,15. Большой комплексный пример использует тот же самый массив структур, как в примере 7.14: нулевой процесс посылает сообщение, которое состоит из всех частиц нулевого класса. Процесс 1 получает эти частицы в смежных полях. Ясгисс Рагсзсгцсс ( спаг с1азз, /» класс частицы »/ бопЫе 4[61, /* координаты частицы »/ спаг Ь [73, /» некоторая дополнительная информация »/ зсгпсс Рагтзсгпсс рагсзс1е[10003, зпс шугапК, МР1 Ясатпз зсаспз, МР1 Пасасуре Рагсзс1есуре, МР1 Пасасуре суре[3] = (МР1 СНАМ, МР1 ПСОВОЕ, МР1 СНАП), гпс ЫосК1еп[З) = (1,6,7), МР1 Атпс бтзр[3) = (О, згнео1(бопЫе), 7»згнео1(бопЫе)), згжеатпс, зпс Ьазе, МР1 Расасуре Ерагстс1ез, 7.4.
Использование производньье пьипов данные 145 Пример 7.16. Оптимизация для последнего примера: лучше, когда заголовок каждой частицы нулевого класса установлен как отдельный блок, это более эффективно для вычислений самых больших последовательных блоков частиц нулевого класса и использования этих блоков в запросе к МР1 ТУРЕ 1МОЕХЕО. Изменение цикла, который вычисляет нЫосК и и41вр, показано ниже. )=0; 1ог(1 = 0; 1 < 1000; 1++) Н(рагстс1еЫ .с1аее = = О) ( Хог(К = 1+1; (К < 1000)йй(рагС1с1еГЯ.с1авв == О); К++); г41вр()3 = т; нЫосК1епГЯ = К-1; )++, = 1с; ) ИР1 Туре тпоехео(), нЫосК1еп, нбйвр, Рагсйс1есуре, КЕрагсйс1ев); 7.4.
Использование производных типов данных 7,4.1. Передать тип В данном случае производный тип данных передается операционной системе, а не каким-то пользовательским процессам. Производный тип данных должен быть передан прежде, чем он будет использоваться при обмене данными. Переданный 4асасуре может продолжать использоваться как аргумент входа в строителях типов (так, чтобы другой 4аСасурев мог быть получен из переданного баСаСуре). Примитивный тип данных передавать не нужно. МР1 ТУРЕ СОММ1Т(4асасуре) 1МООТ басасуре тип ланных, который передается в ОС 1пс МР1 Туре соиа1с(МР1 Оасасуре *басасуре) МР1 ТУРЕ СОММ1Т(ОАТАТУРЕ, 1ЕКЮК) 1МТЕСЕК ОАТАТУРЕ, 1ЕКЮК МР1 ТУРЕ СОММ1Т передает производный тип данных басасуре в ОС.
Перецача не подразумевает, что 4асасуре привязан к текушему содержанию буфера связи. После того, как басасуре был передан, он может неоднократно повторно использоваться, чтобы идентифипировать данные. 7.4.2. Освобождение Объект баСаСуре освобождается запросом к МР1 ТУРЕ ГКЕЕ. МР1 ТУРЕ РКЕЕ(даСаСуре) 1МООТ 4асасуре тип данных, который освобождается 1пс мр1 туре атее(мр1 Оасасуре вбасасуре) МР1 ТУРЕ ЖОКЕЕ(ОАТАТУРЕ, 1ЕКЮК) 1МТЕСЕК ОАТАТУРЕ, 1ЕККОК МР1 ТУРЕ ГКЕЕ регистрирует объект типа данных, связанный с басасуре для оснобождения и устанавливает басасуре к МР1 ОАТАТУРЕ МОЕЬ, Любая связь, которая в это время 146 7.
Определяемые пользователем типы донных и опокоеко данных использует этот басасуре, завершится обычно. Производные типы данных, которые были определены из освобожденного типа данных не повреждаются. Пример 7.17. Следующий фрагмент программы дает . пример использования МР1 ТУРЕ СОММ1Т и МР1 ТУРЕ ГКЕЕ. 1пс суре1, суре2; МР1 Туре сопсййпопв(5, МР1 РРОАТ, йсуре1); /ь созлание объекта нового типа ь/ МР1 Туре соввйс(йсуре1) /ь новый суре1 может быть использован ь/ /е лля обненов ланныии ь/ /ь суре2 ножет быть использован лля обменов ланныии ь/ МР1 Туре чесуог(3, 5, 4, МР1 РЕОАТ, йсуре1) /ь созлается объект нового типа ь/ МР1 Туре соввгс(йсуре1) /ь новый суре1 может использоваться лля обиенов ь/ МР1 Туре аггее(йсуре2) /ь освобожление типа ь/ Суре2 = Суре1 /ь суре2 может использоваться дпя обменов */ МР1 Туре аггее(йсуре2) /ь суре1 и суре2 не действительны; суре2 имеет величинуь/ /ь МР1 РАТАТУРЕ МОРА и суре1 неопределен ь/ 7.4.3.
Соотношение для количества элементов Функция МР1.5епб(Ьпу, соипс,басасуре,, ), где сеанс>1, интерпретируется, как будто запрос передаст новый тип данных, который является сочленением соппс копий.басасуре. Таким образом, МР1.5епб (Ьп1, соппс, басасуре, бевс, сая, сопки) эквивалентна вызовам: МР1 Туре сопс1бпопв(соппс, басасуре, йпенсуре) МР1 Туре соввйс(йпенсуре) МР1 Бепб(ЬпХ, 1, пеьгсуре, бевс, сая, совв).
Подобные утверждения верны ко всем другим функциям связи, которые имеют аргументы соппс и басасуре. 7.4.4. Соответствие типов Предположим, что посылающая функция МР1 Яепб(ЬпХ,соппс,басасуре,бевс,сая,совв) выполнена, где басасуре имеет отображение типа ЦСурЕО, б1ВРО), ..., (СурЕ„Ы б1ерп 1) 1, с диапазоном ехсепс. Функция посылает п*соппс элементов, где элемент (1,)) записан по адресу аббг;б — ЬиХ + ехсепс * 1 + бйвр. и имеет тип суре) для анО, ,соипс-1 и 1пО,..., и-1.
Переменная, записанная по адресу аббг 1 в вызывающей программе, лолжна иметь тип, который соответствует суре . Точно так же предположим, что выполнена получающая функция МР1Р.есч(Ьи1, сеанс, басасуре,вопгсе, сая,совв,всасив). Принимающая функпия получает до пьсоипс элементов, где элемент (1,)) записан по адресу Ьп1+ ехсепс * 1+ ббвр и имеет тип сурей Соответствующий тип определен согласно наименованию типа передачи басасурев, т,е, как последовательность примитивных компонентов типа.