В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 45
Текст из файла (страница 45)
«/ ргйпсй("гапК = '/б В='/б~п", гапК, В); /« Все ветви завершают системные пропессы, связанные с топологией « сошш сагФ и завершаю выполнение программы «/ МР1 Сошш тгее(йсошш сагс); МР1 Е1па11хе(); геспгп О; /« Пример 2 « Сдвиг данных на кольпе конпьютеров. Конвейер. « Нулевая ветвь передает данные (значенне своего ранга) ветви 1, « ветвь 1 перелает принятое значение ветви 2, и т.л., ветвь зйзе-1 « перелает, принятое от ветви вйхе-2 значение, ветви О. «/ $1пс1пбе <шр1.Ь> й1пс1пбе <всб1о. Ь> Фбе11пе ИОМ 01МЯ 1 1пс шайи(1пс агяс, салаг«« агкч) ( йпс гапК, зйхе, 1, А, В, б1шв[ИОМ 01МЯ); 1пп регйодз[ИОМ 01МЯ), вопгсе, безп; 1пп геогбег = О; МР1 Соппп соппп сагс; МР1 Яъаппз зъаъпз; МР1 1пйп(йагйс, йагкч); /« Каждая ветвь узнает количество ветвей «/ МР1 Сошш гапК(МР1 СОИМ НОВ00, йгапК); /« и свой номер: от О ло (зйхе-1) «/ МР1 Соппп зпхе(МР1 СОИМ НОВЫ, йв1хе); А = гап1с; В = -1; 176 й.
Примеры параллельных пропрем.и /« Обнупяем массив бпшз и заполняем массив ретпобз ппя топологии "копьпо" «/ тот(т = О, т < БОМ 01МЯ, т++) ( бтшз[т] = О, регтобз[п] = 1, /« Заполняем массив бпшз, гпе указываются размеры (одномерной) решетки «/ МР1 01шз стеасе(зтхе, МОМ 01МЯ, бтшз), /« Создаем топологию икопьпои с сошшпптсасот(ом) соппп сагс «/ МР1 СагС„стеаСе(МР1 СОИМ НОВЕГО, МОМ 01МЯ, бтшз, ретпобз, геогбег, йсошш сатс), /« Кажная ветвь находит своих соседей впопь копьца, в направлении больших значений рангов «/ МР1 Сагс зЬ|1с(соуп сатс, О, 1, йзоптсе, йбезс), /« О-ветвь инициирует передачу данных (значение своего ранга) вдоль « копьпа, и принимает это же значение от ветви зтзе-1 */ т1(тапи =-" О) ( МР1 Яепб(ФА, 1, МР1 1МТ, безс, 12, сошш сатс), МР1 Веси(ФВ, 1, МР1 1ИТ, зопгсе, 12, сошш сагС, ззСаСпз), рттпст("тап)с=%б А=%б Вк%б ~п", тапи, А, В), /« Работа всех остальных ветвей «/ е1зе ( мр1 Веси(ФВ, 1, мР1 1ит, зоптсе, 12, сопи сагс, йзсаспз), МР1 Яепб(ФВ, 1, МР1 1МТ„ безс, 12, сошш сагс), /« Все ветви завершают системные процессы, связанные с топологией « соппп сагс и завершаю выполнение программы «/ МР1 Соппп ттее(йсошш сатС), МР1 Ртпа1тзе(), геспгп О, 9.1.4.
Обмен данными на системе компьютеров с топологией связи "линейка" /« Сдвиг данных на линейке процессов с использованием МР1 РВОС М01Ь процессов «/ йтпс1пбе <шрп Ь> йтпс1пбе <зсбто Ь> йбетппе МОМ 01МБ 1 ппс шакп(тпс атис, сЬаг ««агяч) ппс тпс тпс ппс МР1 Сошш гапй, зпзе, и, А, В, бипз[МОМ 01МЯ], регпобз[МОМ 01МЯ], пен соогбз[ИОМ 01МБ], зопгсеЬ, безсЬ, зоптсеш, безсш, геогбет = О, сошш сатс; Ниже приведен пример, демонстрируюший операцию сдвига данных на линейке компьютеров, которая очень часто встречается при решении задач на мультикомпьютерах.
Хотя приведенный здесь пример очень простой, но он может, как и примеры и 9.1.3, послужить неким шаблоном, который испояьзуется для решения сложных задач. Все ветви линейки одновременно сдвигают свои данные соседним ветвям вдоль линейки на один шаг в сторону увеличения и затем в сторону уменьшения ранга ветвей. У граничных ветвей соседи имеются только с одной стороны. Поэтому здесь удобно использовать понятие МР1 РВОС МОЮ процессов. 9.1 Простые примеры 177 МР1 ясатпз зсаспз, МР1 1п1с(йагяс, йагйч), /» Каждая ветвь узнает количество ветвей »/ МР1 Сов1п гапй(ИР1 СОММ НОВЫ, йгапй), /» и свой номер от 0 ло (згне-1) »/ МР1 Соппп зтхе(МР1 СОИМ НОВЫ, йз1не), /» Обнуляем массив б1вз и заполняен массив рег1обз лля топологии "линейка" »/ 1ог(1 = О, 1 < МУМ 01МЯ, т++) ( б1вз[1] = О, рег1обз[1] = О, /» Заполняем массив б1аз, гле указываются размеры (одномерной) решетки »/ МР1 Отан сгеасе(згне, МОМ 01МЯ, б1вз), /» Созлаем топологию "линейка" с совапп1сасог(ом) сова сагс »/ МР1 Сага сгеате(МР1 СОИМ НОВЫ, КОМ 01МЯ, б1вз, регпобз, геогбег, йсовв сагс), /» Отображаем ранги в коорлинаты и выволнм их »/ МР1 Сагс соогбз(соппп сагт, гапк, МУМ 01МЯ, пеы соогбз), А = пен соогбз[0], В = -1, /» Каждая ветвь нахолит своих соседей вдоль линейки, в направлении больших * значений номеров компьютеров и в направлении меньших значений номеров » Ветви с номером пен соогбз[0] == О не имеют соседей с меньшим номером, * поэтому с этого направления эти ветви принимают данные от несушествуюших » ветвей, т е от ветвей зопгсев = МР1 РВОС ЙУЫ, и, соответственно, » передают ланные в этом направлении ветвям безсв = МР1 РЮС ИУЫ.
» Аналогично опрелеляется соселство для ветвей с номером » пеы соогбз[0] == бтаз[О]-1 »/ 11(пеы соогбз[0] == 0) ( зопгсев = безсв = МР1 РВОС МЖ1., е1зе ( зопгсев = безсв = пеы соогбз[0]-1, 11(пен соогбз[0] == б1аз[0]-1) с безсЬ = зоцгсеЬ =МР1 РЮС НО~1., е1зе ( безсЬ = зопгсеЬ = пеы соогбз[0]+1, ) /» Каждая ветвь передает свои данные (значение переменной А) своей * соседней ветви с большим номером и принимает данные в В от » соселней ветви с меньшим номером Свой номер и номер, * принятый в В выволятся на печать »/ МР1 Яепбгесч(йА, 1, МР1 1МТ, безтЬ, 12, йВ, 1, МР1 1МТ, вопгсеа, 12, сопел сагс, йзсатпз), ргтпс1("пен соогбз[0] = /б В = /б1п", пеы соогбз[0], В).
/» Слвиг ланных в противоположную сторону и вывод соответствуюших данных »/ МР1 Яепбгесч(йА, 1, МР1 1МТ, безсв, 12, йВ, 1, МР1 1МТ, зопгсеЬ, 12, совш сагс, йзсатпз), рг1псХ("пен соогбз[0] = Уб В = /Фп", пен соогбз[0], В), /» Все ветви завершают системные процессы, связанные с топологией 9. Примеры параллельных программ « сошш сагс и завершаю выполнение программы «/ МР1 Сошш атее(ксошш сагФ); МР1 Г1па11ге(); гесигп 0; Применение МР1 РВСС МВьь процессов значительно упрошает программирование подобных операций, т. к. не нужно отдельно программировать граничные и внутренние ветви решетки. 9.2. Произведение двух матриц В этом пункте приведено три примера произведения двух матриц, выполняемых на системе с разными топологиями.
В первом примере матрицы перемножаются на системе с топологией связи "кольцо", зо втором — на системе с топологией связи "двумерная решетка" я, наконец, в третьем — на топологии "трехмерная решетка". Схемы распределения данных по компьютерам приведены в гл. 2 для всех трех примеров. 9.2,1. Произведение двух матриц в топологии "кольцо" В первом примере предполагается, что обе матрицы разрезаны на части заранее и каждая ветвь считывает свои части обеих матриц с дисковой памяти. Здесь каждая ветвь генерирует свои части матриц. Схемы распределения данных по компьютерам приведены и п. 2.2.1.
/« Произведение двух матриц в топологии "кольцо" компьютеров «/ /* В примере предполагается, что количество строк матрицы А и количество « столбцов матрицы В делятся без остатка на количество компьютеров в системе, * В данном случае задачу запускаем на восьми компьютерах. «/ й1пс1пйе<зсб1о. Ь> з1пс1ибе<шр1.Ь> $1пс1пбе<С1ше Ь> й1пс1пбе<зуз/с1ше.Ь> /« Залаем в каждой ветви размеры полос матриц А, В и С. (Здесь предполагается, « что размеры ветвей олинаковы во всех ветвях. «/ Зе)ет1пе М 320 йоет1пе М 40 /« МОМ 01МЯ вЂ” размер декартовой топологии.
"кольцо" - одномерный тор. */ Фцег1пе МУМ 01МЯ 1 Зоеттпе Е(.(х) (здгеот(х) / зпгео1(х[03 [03)) /« Залаем полосы исходных матриц. В каждой ветви, в данном случае, « они одинаковы «/ зсасйс бопЫе АЕМЗ ЕМ3, В[ИЗ ЕМл, СЕМл ЕМЛ; 1пс шайи(1пс атас, сЬаг ««агцп) ( тпс гапк, зтге, 1, ), к, 11, ~1, б, зонг, дезе; 1пс 01шз[МВМ 01МЯ3, рег1ос)в[МОИ 01МЯ3, пеы соогбз[МУМ 01МЯ3; 1пс геогоег = 0; МР1 Соппп сошш сагс; МР1 Ясаспз зс; зсгпсс с1шепа1 сч1, сч2; /« Лля засечения времени «/ 1пс йс1; /« Инициализапия библиотеки МР1«/ 179 9 В.
Произведение двух митрич МР1 1пдс(йагйс, йагйч), /х Каждая ветвь узнает количество задач в стартовавшем приложении х/ МР1 Сошш здке(МР1 СОИМ НОВ1.0, Фндке), /х и свой собственный номер от О до (вдхе-1) х/ МР1 Сошш гапК(МР1 СОММ ИОВЫ, йгапК), /х Обнуляем массив бдше и заполняем массив регдобз для топологии нкольпон х/ Хог(д=О, д<МОМ 01МЯ, д++) ( «)дшз[д3 = О, регдобп[д~ = 1, /х Заполняен массив бдшз, где указываются размеры (одномерной) решетки х/ МР1 Одшз сгеапе(здке„ МОМ 01МВ, адин), /х Создаем топологию "кольцо" с сошшппдсасог(ом) сошш сагп х/ МР1 Сагс сгеасе(МР1 СОИМ ЧОВз.0, КОМ 01МБ, бдшз, регдобь, геогбег, йсошш сагс), /х Отображаем ранги на координаты компьютеров, с целью оптимизации * отображения заданной виртуальной топологии на физическую топологию х систены х/ МР1 Сагс соогбз(сошш сагс, галК, МОМ 01МЯ, лен соогбв), /» Кажная ветвь находит своих соседей вдоль кольца, в направлении * неньших значений рангов х/ МР1 Сагс в)дд1с(сошш„сьгс, О, -1, йзопг, йпезп), /х Каждая ветвь генерирует полосы исходных матриц А и В, полосы С обнуляет х/ Хог(д = О, з.