В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 47
Текст из файла (страница 47)
ССпГ033 ГпГ2)3, */ /» Банные »/ зпп *р, /* размеров решетки процессов рЫ соответствует пЫ » и произведение 3-х измерений эквивалентно размеру группы соппп »/ /» Коммуникатор для процессов, умножаюших матрицу на матрицу »/ ИР1 Сошш соппп, /* Лапее все описываемые переменные значимы во всех ветвях, в том числе и ветви О */ 9 й. Лраизеедеиие двух матриц боцЫе «АА, »ВВ, *СС, «СС1, /» Локальные подматрипы (полосы) «/ хпс пп[33, /» Размеры полос в А и В и подматрип СС в С »/ /» Коммуникаторы для 30 решетки, для подрешеток, и копии сошш »/ хпс соогбз[33, /» Пекартовы координаты »/ дпс дапх, /» Ранг процесса (ветви) /» Смешения и размеры для операций всат пег/яасЬег »/ дпс »бхвра, «бхврЬ, »бхзрс, «соппса, «соцпсЬ, »соцпсс, /» Переменные и массивы для создаваемых типов данных »/ МР1 Расасуре суреа„ суреЬ, Ъурес, сурен[2~, хпс регхобз[З), гешадпв[33, МР1 Сошш сопла 30, сошш 20[33, сопи„10[33, рсошш, хпс х, ), к, вхкеогбопЫе, Ыеп[23, бхзр[2д, МР1 Сошш бпр(сопел, йрсоппп), /* Копия коммуникатора сопел «/ /« Передача параметров п[33 и р[Зд «/ МР1 Всавс(п, 3„ МР1 1ИТ, О, рсоппп), МР1 Всазс(р, 3, МР1 1ИТ, О, рсоппп), /» Создание ЗР решетки процессов «/ аког(х = О, х < 3, х++) регдобв[х~ = О, МР1 Сагс сгеасе(рсоппп, 3, р, регдобв, О, йсошш 30), /» Нахождение ранга и декартовых координат »/ МР1 Сопи„гап)х(соппп 30, йгапй), МР1 Сагс соогбз(сопел 30, гапк, 3, соогбз), /» Получение коммуникаторов для подрешеток размерности 20 «/ аког(х = О, д < 3, д++) ( аког() = О, ) < 3, )++) гешахпз[)З = (д '= )) ° МР1 Сагс вцЬ(сопел„30, гешахпз, йсошш 2РЫ ), /« Получение коммуникаторов для подрешеток размерности 10 «/ Лог(х = О, д с 3, д++) ( аког() = О, ) < 3, )++) гешахпв[)3 = (д == )), МР1 Сагс вцЬ(сошш 30, гешахпв, йсоппп 10[д3), /» Выделение памяти .пля подматриц «/ Хог(д = О, д с 3, д++) пп[дд' = п[х)/р[х.), йбеХдпе АА(х,)) АА[пп[1)«х+)д йбе1хпе ВВ(д„)) ВВ[пп[2)»х+Д3 ебе1дпе СС(д,)) СС[пп[2д»х+)3 АА = (боцЫе «)ша11ос(пп[03» пп[13» вхиео1(боцЫе)), ВВ = (бопЫе «)ша11ос(пп[1Д «пп[2д' * вхзео1(боиЫе)), 188 9 Примера параллельных программ /э Раб й( /а ота нулевой ветви а/ гапК == 0) Создание типа данных для подматрид в А л/ МР1„Туре чессог(пп[О], пп[1], п[1], МР1 00ОВ1Е, и корректировка размеров подстрок а/ МР1 Туре ехсепс(МР1 00УВЕЕ, йздяео1боцЫе), Ыеп[0] = 1, Ыеп[1] = 1, е)дяр[0] = 0 е)двр[1] = здяео1ооцЫе а пп[1], сурен[1] = МРТ ПВ, МР1 Туре зггцсс(2, Ыеп, е(двр, сурен, йсуреа), МР1 Туре сошшдп(йсуреа), Нахождение смешений и размеров подматрип в А Подматриды в А упорядочены аналогично упоряпоче в решетке е/ е)дяра = (дпс *)ша11ос(р[О]*р[1] * вдхео1(дпс)), соцппа = (дпя а)ша11ос(р[О]эр[1] а здхеод(дпъ)), Хог(1 = О, 1 < р[0], )++) Хог(д = О, д < р[1], д++) ( бдвра[)ар[1]+д] = ()ар[1]апп[0] +д), соцпса[]*р[1]+д] = 1, Тоже самое для массива В а/ МР1„Туре чессог(пп[1], пп[2], п[2], МР1 00ПВЕЕ, Одер[1] = здяеоИоцЫеапп[2], МР1 Туре ясгцсъ(2,Ыеп,е)двр,сурен,йсуреЬ), МР1 Туре сошшдс(йъуреЬ), бдзрЬ = (дпп э)ша11ос(р[1]ар[2] э вдяеоХ(дпс)), соцпсь = (дпс л)ша11ос(р[1] ар[2] ь вдзеод(дпс)), Хог() = О, 1 < р[1], )++) 1ог(д = О, д с р[2], д++) ( ь(дярЬ[)ар[2]+д] = (]ар[2]апп[1] +д).
соцпсЬ[)ар[2]+д] = 1, Тоже самое для массива С ь/ МР1 Туре чеспог(пп[О], пп[2], п[2], МРХ 00081Е, е)дзр[1] = вдяео1боцЫеьпп[2], МР1 Туре вягцся(2, Ыеп, ддзр, сурев, йпурес), МР1 Туре сошшдп(йяурес), е)дврс = (дпс а)ша11ос(р[О]ар[2] л вдхео1(дпс)), соцпсс = (дпт а)ша11ос(р[0]ар[2] ь вдяеоХ(дпь)), аког(] = О, ] < р[0], )++) 1ог(д = О, д < р[2], д++) ( андерс[]ар[2]+д] = (]ар[2]апп[0] +д), соцпсс[)ар[2]+д] = 1, ] /а Нулевая ветвь завершает подготовительную йпурев[0]), нив процессов йьурез [О] ), йсурез[0]), работу а/ СС = ИоцЫе ь)ша11ос(пп[0] а пп[2] ь ядхео1(е)оцЫе)), У.В.
Произведение двух матриц 189 /» Вычисления Этацы представпены на рис 2 б в гп 2 «/ /« 1 Нулевая ветвь передает (всатсег) горизонтальные полосы матрицы А по х координате »/ т1(соогбв[2] == О) ИР1 Ясастегч(А, соппса, бтвра, йуреа, АА, пи[0]»оп[1], мр1 ОСОВЕВ, О, сома 20[2]), МР1 Ваггтег(МРХ СОММ МОЮ.О), /* 2 Нулевая ветвь передает (всатсег) вертикальные поносы матрицы В по у координате */ тт(соогбв[0] == О) МР1 Бсайсеги(В, соппйЬ, бтврЬ, йуреЬ, ВВ, пи[1]»пи[2], МР1 ОООВЬЕ, О, соппп 20[0]), МР1 Ваггтег(МР1 СОИМ ИОВЫ), /» 3 Рассылка (Ьгоабсавс) подматриц АА в измерении х «/ МР1 Всавт(АА, пи[0]«пи[1], МР1 ОООВЬЕ, О, савв 10[2]), /* Ф Рассылка (Ьгоабсавс) подматриц ВВ в измерении х »/ МР1 Всавс(ВВ, пп[1] »пи[2], МР1 ОООВЬЕ, О, савв 10[0]), /» б Вычисление всеми ветвями подматриц СС »/ Хог(т = О, т < пи[0], т++) тог(] = О, ) < пи[2], )++) ( СС(~,)) = О, тот(К = О, К < пи[1], К++) СС(т,)) = СС(т,)) + АА(т,К) » ВВ(К,]), /» б Сбор подматриц СС в измерении у »/ /* Редукция подматрнц СС вначале осушествляется "в плоскости" »/ СС1 = (бопЬ1е »)иа11ос(пи[0] « пи[2] » вгхеот(бопЬ1е)), МР1„Вебпсе(СС, СС1, по[0]«оп[2], МР1 ОРОВЬЕ, МР1 ВОМ, О, сота 10[1]), /» 7 Сбор резупьтатов из плоскости (х,б,х) в узел 0 «/ т1(соогбв[1] == 0) МР1 Оаспегу(СС1, пи[0]»пп[2], МР1 ОООВЬЕ, С, соппсс, бтврс, сурес, О, соппп 20[1]), МР1 Ваггтег(МР1 СОММ КОИ.О), тт(гапК == О) (Хог(т=0, т<М, т++) ( аког(К - "О, К < К, К++) ргхпСХ("%3 1Х ", С(т,К)), ргз.пт1("1п"), 9.
Примеры пораллельныа программ и завершение подпрограммы е/ /ь Освобождение памяти всеми ветвями аггее(АА), аггее(ВВ), тгее(СС), йхее(СС1), МР1 Совв аггее(йрсопип), МР1 Совв„1гее(йсопап 30), аког(х = О, х < 3, х++) ( МР1„Савв аггее(йсопап 20[Л ), МР1 Сопап 1гее(йсовв 10Ы ), х1(гапК == О) ( аггее(соппса), аггее(соппсЬ), 1гее(соппсс), аггее(е(хера), 1гее ИхзрЬ), йгее(йхзрс), МР1 Туре аггее(йпуреа), МР1 Туре 1гее(йсуреЬ), МР1 Туре 1гее(йсурес), МР1 Туре 1гее(йсурез[03), гетпгп О, ) /е Главная программа ь/ хпь ваха(хпс агкс, сЬаг ььагяч) боабйе ьА, ьВ, ьС, хпп зххе, Мур, а[31, р[3), хпп бхвз[МРМ 01МЯ, регхобз [МАМ 01МБЗ, хпп геогбег = О, /* Лля эасечения времени ь/ зьгпсг тхвеча1 ьч1, гч2, хпт пп1, МР1 Сопап сопел, /* Инициализация библиотеки МР1 ь/ МР1 1пхс(йагяс, йагяч), /е Каждая ветвь узнает количество задач в стартовавшем приложении ь/ МР1 Сова зххе(МР1 СОММ МОНЫ, йехие), /ь и свой собственный номер (ранг) ь/ МР1 Сопап гап)х(МР1 СОММ МОНЬР, йМур), /ь Обнуляем массив бхвз и заполняем массив регхобз для топологии "трехмерная решетка" е/ ~ог(х = О, х < МРМ Р1МЯ, х++) ( г)хвзЫ = О, регхое)зЫ = О, /ь Заполняем массив бхвз, где указываются размеры трехмерной решетки ь/ МР1 Рхшз сгеасе(зххе, МРМ 01МЯ, бхвз), /ь Создаем топологию "трехмерная решетка" с соввппхсасог(ом) сошш ь/ МР1 Сага сгеасе(МР1 СОИМ НОНЫ, МРМ 01МЯ, бхвз, регхое(з, геогбег, йсовв), /* Задаем размеры матриц и размеры трехмерной решетки компьютеров ь/ а[Ой = М, 9.2.
Проиэведеиие даик матриц п[13 = И; лМ =К; р[03 = РО; р[13 = Р1; р[23 = Р2; /х В первой ветви выделяем в памяти место лля исходнык матриц «/ 11(ИуР == О) ( А = (боцЫе е)ша11ос(п[03 э цМ е в1кеоХ(боцЫе)); В = (е(оцЫе е)ша11ос(л[13 е п[23 х в1иео1(боцЫе)); С = (ооцЫе э)ша11ос(п[03 э л[23 э в1кеоХ(боцЫе)); /* Ветвь О генерирует искодные матрицы А и В, иатрипу С обнуляет э/ Хог(1 = 0; 1 с И; т++) Хог() = 0; ) < М; )++) А(1,)) = т+1. Хог()' = 0; ) с М, >++) аког( ='О; К <'К; М++) В(),й) = 21+); 1ог(1 = О; 1 < И; 1++) Тог() = О; ~ < К; )++) С(1,)) = 0.0; /е Подготовка матриц ветвью 0 завершена */ /» Каждая ветвь засекает начало уиножения матриц «/ несс1шеоХбау(йсч1, (всгцсс с1шекоце*)0); /* Все ветви вызывают функцию перемножения матриц е/ РМАТИАТ З(п, А, В, С, р, сошш); /э Умножение завершено.
Каждая ветвь умножила свою полосу строк матрицы А на е полосу столбцов матрипы В. Результат находится в нулевой ветви. е Засекаем время и результат печатаем */ ВеСС1шео1бау(йвч2, (вогцсл С1шеколеэ)О); бл1 = (Сч2.дч вес — Сч1.Сч вес) е 1000000 + Сч2.пч цвес — тч1.лч цвес; рг1цСХ("ИуР = %б Тйше = %б~п", МуР, бс1); /е Лля контроля ветвь 0 печатает результат е/ И(Иур == О) ( Тог(1 = 0; 1 < М; 1++) ( аког() = 0; ) < К; )++) рг1плг(и%3.1т ", С(1,))); рг1псХ(и~пи); /х Все ветви завершают систеиные процессы, связанные с топологией сошш е и завершаю выполнение программы е/ 11(МуР == 0) ( аггее(А); аггее(В); аггее(С); 192 9.
Прамерьь параллельаые программ МР1 Савв атее(мсоппп); МР1 Рдпа1дгие(); геспгп(0); 9,3. Задача Дирихле. Явная разностная схема для уравнения Пуассона В этом пункте приведен пример решения дифференциальных уравнений в частных производных, показывающий, с одной стороны, параллельный алгоритм решения этой задачи, а с другой, поясняющий функции обменов, представленные в гл. 5. Здесь приведен фрагмент алгоритма решения указанной задачи, но его вполне достаточно, чтобы создавать параллельные алгоритмы для конкретных задач.
Лля решения задачи применяется алгоритм, использующий 1Р разрезание данных (показанное на рис. 2.8), распределение данных по компьютерам с перекрытием в один столбец (см. рис. 2.9) и реализующих схему обменов между ветвями параллельной программы (см, рис. 2.10). В подпунктах п. 9.3 в основном демонстрируются реализации указанной схемы обменов данными разными обменными функциями. Вид уравнения представлен в гл. 2. Алгоритм реализуется на виртуальной топологии "линейка". В подпунктах приводятся только фрагменты программ, реализующих схемы обменов.