В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 34
Текст из файла (страница 34)
знйссЬ(гапй) ( сазе О: МР1 Всазс(Ьиг'1, соипс, суре, О, соппп); МР1 Яепб(Ьи12, соипс, суре, 1, саЯ, сопка); Ьгеа)г; сазе 1: МР1 Веси(Ьи12, соипс, суре, О, саи, совв); МР1 ВсазС(Ьи11, соипС, Суре, О, савв); Ьгеа1с; Нулевой процесс выполняет МР1 ВсазсЦ, сопровождаемый блокированной операцней передачи МР1 Яепб(). Процесс 1 первым выполняет блокированную операцию приема МР1Лесч Ц, что соответствует МР1 Всазс() нулевого процесса. Эта программа зайдет н тупик. МР1 Всазс() нулевого процесса может блокировать первый процесс, который выполнит соответствуюший МР1 Всазс(), так что МР1 Яепп() не будет выполнен.
Относительный порядок выполнения коллективных и ро)пй-Со-ро)пС операций должен быть такой, чтобы даже они были синхронизованы и никакая блокировка не встречалась, Пример 6.26. Правильная, но недетерминированная программа. зн1СсЬ(гани) саве О: МР1 Всазс(Ьи11, соипс, суре, О, совв); МР1 Яепо(Ьиг2, соипс, суре, 1, саи, совв); Ьгеак; сазе 1: МР1 Веси(Ьи12, соипс, суре, МР1 АМУ ЯОУВСЕ, саи, сопка); допустим, что группа соввΠ— (0,1), соппп1 — (1,2) и соппп2 — (2,0). Если МР1 Всазс() — синхронизированный оператор, то имеется циклическая зависимость: МР1 Всазс() и совв2 заканчивает только после МР1 Всазс() в соввО; МР1 ВсазС() в сопппΠ— только после МР1 ВсазС() в совв1 н МР1 ВсазС() в совв1 — только после МР1 ВсазС() в совв2. Таким образом, программа зайдет в тупик. Коллективные операции должны быть выполнены в таком порядке, чтобы никакие циклические зависимости не встречались.
б.1о. Се,кантика коллективной связи 131 МР1 Осана(Ьц11, соппс, суре, О, сопи); МР1 Веси(Ьц12, соцпт, суре, МР1 АМУ БООВСЕ, гак, сопел); Ьгеак; саве 2; МР1 Яепо(Ьп12, соппс, суре, 1, сац, сопел); МР1 ВсавС(Ьц11, соцпп, Суре, О, сопел); Ьгеак; Все три процесса выполняют МР1 Всавс(). Процесс О посылает сообщение к процес.у 1, после выполнения МР1 Всавс(), и процесс 2 посылает сообщение процессу 1 перед 1Р1 Всавс(). Процесс 1 прежде получает с аргументом любого источника и после выполняет МР1 Всавс(). Возможны два выполнения этой программы с различными передачей и получением, это иллюстрируются ниже на рис. 6.13, Заметьте, что второе выполнение имеет особый эффект, ~ерепача выполнена после того, как мР1 Всавп() получен в другом узле перед мР1 Всавп().
)тот пример поясняет тот факт, что нельзя положиться на коллективные функции связи, ~мея частный эффект синхронизации, И в заключение, в многоподпроцессных выполнениях может быть больше, чем одна, >дновременно выполняющаяся коллективная связь. В этих случаях ответственность польювателя — гарантировать, что тот же самый переключатель каналов не используется одювременно двумя различными коллективными связями. Предположим, что выполняется МР1 Всавс(), используя роЫ-1о-ро)пФ операции. Предюложим, выполняются следующие два правила.
1. Все приемы определяют их источник явно (нет никаких групповых символов). 2. Каждый процесс посылает все сообщения, которые относятся к одному коллективному запросу перед посылкой любого сообщения, который относится к последующему коллективному запросу. Тогда сообщения, принадлежащие последовательным МР1 Всавс(), не могут быть перепутаны, поскольку сохранен порядок ро)п1-1о-ро)п1 операций.
Гарантия, что ро)пь-Ьо-ро!п1 операции не перепутаны с коллективными сообшениями— ~то ответственность пользователя. Один из способов избежать этого — создание отдельного ~ереключателя каналов для коллективной связи. Первое выполнение Процесс: о гесч вела Ьгоайсаве Ьгвайсаве Ьгвайсаве вела гесч Второе выполнение Ьгоайсавп вела гесч Ьгваасвве гвсч вела Ьгоаасаве Рис. 6.13. Два выполнения программы с различными передачей н получением. Стрелками указаны напетермнннрованные соответствия передач н приемов. Нельзя полагаться на синхронизации нз Ьгоас)сввФ, чтобы делать детерминированную программу 7.
Определяемые пользователем типы данных и упаковка данных 7.1. Введение Коммуникационные механизмы МР1, представленные в предыдущей главе, допускают посылку или получение последовательности идентичных элементов, которые являются смежными в памяти. Часто желательно посылать данные, которые неоднородны, типа структуры или (если это не смежные в памяти элементы) типа секции массива.
МР! обеспечивает два механизма, чтобы достичь этого. ° Пользователь может определять производные типы, которые определяют более общее расположение данных. Определяемый пользователем тип может использоваться в МР! функциях связи, аналогично базовому предопределенному типу. ° Процесс посылки может явно упаковать данные, стоящие в нескольких несмежных участках памяти, в один (непрерывный) буфер и затем послать его; процесс получения может явно разделять данные, полученные в буфер, и хранить в нескольких несмежных участках памяти.
Конструирование и использование производного типа описано в пп, 7.2-7.7. Использование упаковываюшей и распаковывающей функций описано в и. 7.8. Часто возможно достичь той же самой передачи данных, используя любой из этих механизмов. Обсуждение всех "за" и "против" каждого подхода, в конце этой главы. 7.2. Введение к определяемому пользователем типу данных Все МР1-функции связи имеют аргумент дасасуре (тип данных). В самом простом случае это примитивный тип, например, целый (хпс) или с плавающей запятой (11оас) я т.д.
МР1 приложения позволяют определяемый пользователем (или "производный" ) тип писать везде, где примитивные типы могут встречаться. Они — не "типы" в смысле языка программирования. Они — только "типы", которые МР1 делает с помощью функций стро. ителей типов, описывающих расположение в памяти наборов примитивных типов. Через определяемые пользователем типы МР1 поддерживает обмен комплексмыми структурами данных, например, секциями массивов и структур, содержащих комбинации примитивных типов данных. Пример 7.1 показывает, как определяемый пользователем тип данных используется при посылке верхней триангуляции матрицы. На рис.
7.1 показана диаграмма расположения в памяти определяемого пользователем типа данных. Пример 7.1. Фрагмент программы, которая передает верхнюю триангуляпию матрицы аолЫе а~1001(1003, бхврГ1001, Ыоск1епН003, х, МР1 Расасуре иррег, /«Вычисление начала и размера каклой строки матрицы (начиная от диагонали) «/ хог(х=0, х<100, ++х) ( бхврЫ = 100«х+х, Ыоск1елЫ = 100-х, 1 /« Создание типа для верхней триангуляции матрицы «/ МР1 Туре хпбехеб(100, Ыоск1еп, бхвр, МР1 ВОВВЬЕ, виррег), МР1 Туре сопвпхс(виррег), /« и его передача «/ МР1 Яепб(а, 1, баррет, бевс, хай, МР1 СОММ МОВЫ), Производный тнп данных построен из основного типа данных с использованием строителей типов, описанных в и. 7.3.
Строители могут применяться рекурсивно. У.й. Введение н определяемому пользователем типу данных 133 сопвеспвевв аеахевв 10110) 10)111 10) 1г166666666666666666666666 Ш1П [П1г)66666666666666666666666 1г)1г)66666666666666666666666 66666666666666666666666 Рис. 7.1. Диаграмма ячеек памяти, представляющих определяемый пользователем тип данных цррег. Заштрихованные ячейки — элементы матрицы, которые будут посланы Производный тип данных — непрозрачный объект, который определяет два предмета: — последовательность примитивных типов и — последовательность целого числа смещений (в количестве байт) значений этих типов от начального адреса. Не требуется, чтобы смещения были положительными, различными илн в увеличивающемся порядке. Следовательно, порядок значений типов в списке производного типа не обязательно должен совпадать с нх порядком в памяти, и значения типов могут появляться в списке больше, чем один раз.
Такая пара последовательностей (нли последовательность пар) называется отображением глина. Последовательность примитивных типов данных (смещения игнорируются) называется сигнатурой типа данных. Предположим, Туревар = ((сурев,агвре),"., (суреп г,оуврп г)), — такое отображение типа, где сурег — примитивные типы и г)1врг — смещения значений этих типов относительно базового алреса, Предположим, Туревгй = (сурее - суреп-1), — соответствующая сигнатура типа. Это отображение типа вместе с базовым адресом ЬпТ определяет коммуникационный буфер, который состоит из и элементов, где 1-й элемент стоит по адресу ЬцХ+Жвря и имеет тип сурег.
Сообщение, собранное из отдельных типов, будет состоять из и значений типов, определенных Турев1я. Имя производного типа может появляться как аргумент в посылающей или получающей функции вместо аргумента примитивного типа, Функция ИР1.5ЕИ0(Ьп~,1,6асасуре,... ) использует адрес посылаемого буфера как базовый адрес ЬцХ производного типа данных, и тип посылаемых данных как производный тип, соответствующий басасуре. Она генерирует сообщение с сигнатурой типа, определенной аргументом басасуре.
Функция ИР1ЯЕСЧ(ЬпТ, 1, г)асасуре, . ) использует адрес буфера приема как базовый адрес ЬпХ производного типа и тип принимаемых данных как производный тип, ссютветствуюший 3асасуре, Производные типы данных могут использоваться во всех посылаюгцих и принимающих функциях, включал коллективные функции (см. гл. 6), В и. 7.4.3 обсуждается случай, где второй индекс аргумента в обменных функциях имеет значение > 1. Примитивный тип данных, представленный в п. 5.2.2, — частный случай производного типа данных и предопределен. Таким обрезом, ИР1 1ИТ вЂ” предопределенный заголовок к типу данных с отображением типа ((гпс, 0) ), с одним элементом типа хпс и нулевым смещением этого элемента относительно базового адреса. Другие примитивные типы данных определены аналогично. Диапазон (ехсепс) типа данных определен, как поле памяти от 184 7. Ояределяемые пользователем ньанм данных и онаноена данных первого байта до последнего байта, заполненного элементами этого типа данных, округпкемыми в большую сторону, чтобы удовлетворить требования к точности совмещения, т.е, если ТурЕвар = ((СурЕЕ, 61эре), ..., (СурЕа 1, баира 1)), ГдЕ 1Ь(Туревар) = вап)бквр1, пЪ(Турешар) = шах.
(8 кар + вкиеот(Суре )) + е, ехсепс(Туревар) = иЬ(Туревар) — 1Ь(Туревар). где )=О „,п-1, 1Ь вЂ” нижняя и иЬ вЂ” верхняя границы типа. Если Суреа требует выравппвания к адресу байта, который является кратным Ка байт, то е — наименее неотрипатель ное приращение, необходимое для округления ехсепс(Туревар) к следующему кратному шах,К1. (Определение диапазона расширено в и. 7.6.) Пример 7.2. Предположим, что Туре=((бопЫе,О), (спаг,8)) (боцЫе — со смещением ноль, сЬаг со смещением восемь). Предположим, кроме того, что вещественные величины (бопЫе) должны строго выравниваться по адресам, кратным восьми байтам. Тогда 1Ь(Туре) шкп баир) — — О, пЬ(Туре) = шах)(бквр1+ экхеоу(суре))) + е = (8+ 1+ 7) = 16, и диапазон этого типа равен 16 (8 байт (бопЫе) + 1 байт (сйаг) = 9, которая округляется к следующему кратному 8, т.е.
16), Отображение этого типа проиллюстрировано ниже на рис. 7.2. бачите ьпе 8 байт 1 байт е 7 байт Рис. 7.2. Отображение типа Туре=((боиЫе,0), (спас,8)) Замечание. Округляющий терм е, который появляется в формировании верхней границы типа, должен облегчить формирование типов данных, соответствующих массивам струк. тур. Диапазон типов определен, чтобы описать структуру диапазона памяти, которую компилятор будет распределять для структур в массиве структур. Волее явный контроль диапазона описан в и. 7.6. Такой явный контроль необходим в случаях, например, где компилятор предлагает различные выборы выравнивания дм структур.