В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 22
Текст из файла (страница 22)
определение порядка требует, чтобы посылающие операции были согласованы с получаощими операциями. Не имеется никаких ограничений на порядок, в котором операции ~авершаются (см. пример 5.13). Пример 5.13. Порядок завершения для неблокированных операций. ИР1 Совы гапк(совы, йгап)с); :1аи1 = 1а1зе; :1аи2 = Ха!ее; .т(гапк == 0) ( МР1 1зепб(а, и, МР1 Г1,ОАТ, 1, О, соппп, йг1); МР1 1зеп4(Ь, 1, МР1 Р1ОАТ, 1, О, савв, йг2); бо нЬ11е(!(11а51 йй 11ая2)) ( г1(~ т1аб1) МР1 Тезс(йг1, й11аи1, йз); 11(' 11а52) МР1 Тезс(йг2, й11а62, йз); Пзе ( 11(гап)г == 1) ( МР1 1гесч(а, и, МР1 Г1ОАТ, О, О, совы, йг1); МР1 1гесч(Ь, 1, МР1 РЬОАТ„ О, О, совы, йг2); бо нЬ11е(!(11а61 йй 11ац2)) ( 11(' 11аи1) в.
7. Нвблокированные взаимодействия МР1 Тевп(йг1, й11а51, йв); 11(! 11а52) МР1 Теис(йг2, й11а52, йв); Как в примере 5.12, первая передача нулевого процесса согласуется с первым приемом первого процесса. Однако второй прием может завершиться перед первым приемом и вторая передача может завершиться перед первой передачей, особенно если первый обмен передает большее количество данных, чем второй. Так как завершение приема может длиться произвольное количество времени, не имеется никакого способа завершить эту получающую операцию, за исключением выполнения запроса к функции завершение-гесе1ие. С другой стороны, завершение передающей операции может быть выведено косвенно из завершения соответствующей получающей операцией.
Прогресс. Связь дает право один раз взаимодействовать передающему и соответствующему принимающему процессам. Правило прогресса требует, чтобы одна из обменных функций имела возможность возвратить управление (онн могут завершиться не оба, поскольку передающий мог бы быть согласован другим принимающим или принимающий мог бы быть согласован другим передающим).
Таким образом, запрос к МР1 МА1Т, который завершает прием, в конечном счете возвратит управление, если соответствующая передача была начата и если передача не была принята другим принимающим. В частности, если соответствующая передача неблокирована, то принимающий пропесс завершается, даже если не было запроса к функции завершение-ввод, сделанного на стороне передающего. Точно так же запрос к МР1 МА1Т, который завершает передачу, в конечном счете возвращает управление, если соответствующий прием был начат и если прием не был обеспечен другой передачей и даже если не было запроса к функции завершение-геси, сделанного на стороне получающего.
Пример 5.14. Иллюстрация прогресса семантики. МР1 Сопке гапк(соив, йгапк); 11(гали == О) ( МР1 Яепй(а, соппс, МР1 Р1ОАТ, 1, О, сопвп); МР1 Яепй(Ь, соцпс, МР1 Р(.ОАТ, 1, 1, соквп); е1ве ( 11(гапк == 1) ( МРХ 1геси(а, соиле, МР1 Р|ОАТ, О, О, сопкп, йг); МР1 Меси(Ь, соцпс, МР1 Р1.0АТ, О, 1, соил, йвсатпв); МР1 Майт,(йг, йесаъпв); Эта программа безопасна и не зайдет в дедлок. Первая передача нулевого процесса должна возвратить управление, даже если первый процесс еще не достиг запроса к МР1 ЫА1Т. Таким образом, нулевой процесс продолжит выполнение и выполнит вторую передачу, позволяя первому процессу завершить выполнение. Если используется запрос к МР1 ТЕЯТ, который завершает прием, неоднократно сделанный с теми же самыми аргументами, и соответствуюгцая передача была начата, то принимающая функция в конечном счете возвратит 11аб = сгпе (если передающий процесс не был удовлетворен другой принимающей функцией). Если запрос к МР1 ТЕЯТ, который завершает передачу, неоднократно сделан с теми же самыми аргументами и соответствующий 30 5.
Рогов<а-Ро<п< взаимодействия трием был начат, то запрос в конечном счете возвратит 11ап = сгпе, если получающий <е был удовлетворен другой передачей. Равнодоступность. Утверждение, сделанное в и, 5.4 относительно равнодоступности, применяется и к неблокированной связи. А именно, МР1 не гарантирует равнодоступность <од процессов. Буферизация и ограничения ресурсов. Использование неблокированной связи усиливает потребность в буферизации данных.
Следовательно, ограничения безопасного прораммирования могут быть ослаблены, если некоторое количество буфера для хранения <анных будет использовано отложенной связью. Как минимум, подсистема связи должна <опировать параметры передающей или получающей функций перед возвращениями за<роса. Если этот буфер исчерпан, то запрос, который делает новую передачу, потерпит <судачу, т.к. посылающая и принимающая функции не допускают блокировки, Поломка <араллельной программы, которая превышает пределы по количеству отложенных небло<ированных связей, соответствует одноименной поломке последовательной программы, когорая превышает границы размеров стека, должна быть отмечена как патологический слу<ай, отнесенный или к патологической программе, или патологическому МР1 приложению.
Пример 5.15. Иллюстрация буферизации для неблокированных сообщений. <Р1 Сония гап1<(сопяп, йгапк); Л (гап)< == О) ( МР1 1зепо<зепдЬпт, соппс, МР1 Р1.ОАТ, 1, сан, соняв, йге<)); МР1 Весч(гесчЬпт, соппс, МР1 РЬОАТ, 1, сап, сова, йзъаспз); МР1 Иа1с<йге<), йзсаспз); .1зе ( йт(гап)< == 1) ( ИР1 1зепо(зепбЬпт„ соппс, МР1 РЮАТ, О, сан, сони, йге<)); МР1 Р<есч(гесчЬп1, соппс, МР1 РЬОАТ, О, сан, соив, йзсаспз); МР1 Найс(йге<1, йзсасиз); Эта программа подобна программе, показанной в примере 5.14: два процесса обменнваотся сообщениями, первыми выполняются передачи, затем прием. Однако в отличие от <римера 5.14 используется неблокированная передача.
Эта программа безопасна. Пример 5.16. Порядок взаимодействий с неблокированными операциями. $Р1 Сония гап«(сония, йгап1<); .т(гап« == О) 4 ИР1 Бел<1(зев<)Ьп11, соппс, ИР1 РЬОАТ, 1, 1, соя<и); МР1 Бено(зепбЬп12, сопит, ИР1 РЬОАТ, 1, 2, сояяп); .1зе ( Ат(гап)< == 1) ~ ИР1 1гесч(гесчЬпт2, сопит, ИР1 РЬОАТ, О, 2, сояяп, йгео1); МР1 1гесч(гесчЬпт1, соппс, МР1 ГЬОАТ, О, 1, сопвп, йге<12); ИР1 Найс(йге<)1, йзсаспз); МР1 <4азс(йге<)2, йзсаспз); 81 б.б. Азкозкеетвеннме завершения пеблокировоппых операций Здесь нулевой процесс программы посылает два сообщения, первый процесс получает их в обратном порядке.
Если бы использовались блокированная передача и блокированный прием данных, то программа была бы ненадежна: первое сообщение должно было бы гопироваться в буфере, затем посылается второе сообщение; первый процесс мог бы получить первое сообщение только после второй посылки нулевым процессом. Однако так гак мы использовали неблокированные получающие операции, программа безопасна. МР1 приложение будет хранить установленное количество информации из первой передачи, первый процесс после инициализации первой принимающей функции выполнит вторую принимающую функпию и примет запрос с пай = 1 от нулевого процесса, после этого инициализированной ранее первой функцией примет другое сообщение с са8 = 2. Подход, иллюстрируемый в последних двух примерах, может использоваться вообще, для преобразовывания ненадежных программ в безопасные.
Предположим, что программа состоит из последовательных стадий связи. Стадия связи может быть перезаписана как две подстадии: первая, где каждый процесс отправляет данные, и вторая, где процесс ждет завершения всей связи. Порядок, в котором данные отправляются по каналам, неважен, важно, чтобы общее число сообщений, посланных или полученных в любом узле, было одинаково. 5.7.7. Комментарий семантики неблокированной связи Как правило, инициализация обменов данными использует память для буферизации и при посылке, и при получении. Процесс посылки должен следить за отправленными данными, и процесс получения нуждается в оболочке сообщения, чтобы согласовать параметры приема. Таким образом, буфер для отложенной связи может быть исчерпан не только, когда любой узел выполняет большое количество передач или приемов, но также и когда любой узел — это назначение большого количества сообщений.
В большой системе такой вЬо$-зро1в может встречаться, даже если каждый индивидуальный процесс имеет только маленький интервал задержки при посылке или получении, т.е. модель связи очень несбалансированная. 5,8. Множественные завершения неблокированных операций Удобней и эффективней завершить в одном запросе список многократно отложенных операций связи, чем завершение только одной операции. Функции МР1 ИА1ТАИ1' или МР1 ТЕЯТАИУ используются, чтобы завершить несколько операций, МР1 ЫА1ТА(.1. нлн МР1 ТЕБТАЕŠ— чтобы завершить все операции в списке, МР1 ИА1ТЯОМЕ или МР1 ТЕБТБОМŠ— чтобы завершить некоторые операции в списке. Поведение этих функций описано ниже.
МР1 ЫА1ТАИу(соипс, аггау о1 гее)иезъз, гпе(ех, зсаииз) 1И соипс длина списка 1ИООТ аггау о1 гее(иезсз массив имен запросов СОТ Тпбех индекс в массиве имени запроса, который завершился статус принятого пакета данных 00Т зиасиз гпс МР1 Иайсапу(1пс соипс, МР1 Кее(иенс ваггау о7 гейиезсз, йпг вйпбех, МР1 Ягагиз взиаииз) МР1„ЧА1ТАИу(СООИТ, АККА'1' ОР КЕЦОЕЯТБ, 1ИОЕХ, БТАТОБ, 1ЕККОК) 1ИТЕОЕК СООИТ, АККАУ ОР КЕЦОЕБТБ(в), 1ИОЕХ, БТАТОБ(МР1 ЯТАТОЯ Я1ЕЕ), 1ЕККОК МР1 ИА1ТАМУ блокирована, пока одна из операций обмена, связанных с запросами, заголовки которых записаны в массиве аггау о1 гее(иезиз, не завершилась. Если к этому времени будет завершена более чем одна операция, МР1 ИА1ТАМ'1' произвольно выбирает одну из них и завершает ее.