В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 18
Текст из файла (страница 18)
Пример 5,3, Источник и приемник неправильно определяют соответствие типов. ИР1 Сова гапК(соппп, гацК); ь1(гапК == 0) МР1 Яепе((а, 10, МР1 РЬОАТ, 1, сая, соппп); п1зе11(гапК = = 1) МР1 Веси(Ь, 40, МР1 ВУТЕ, О, пай, сова, всапцв); Этот код ошибочен, так как источник и приемник не обеспечивают соответствия типов панн ых. Пример 5.4. Источник и приемник определяют связь без контроля типов значений. (Р1 Соппп гапК(соппп, гапК); ~Х(гапК == О) МР1 Бепб(а, 40, МР1 ВУТЕ, 1, саЕ, соппп); .1ве11(гапК = = 1) МР1 Веси(Ь, 60, МР1 ВУТЕ, О, пай, соппп, впатцв); )тот коп правилен, независимо от типа и размера а и Ь (если это не приводит за пределы )уферов). Сказанное в данной пункте о соответствии типов относится к базовым типам.
о. РогпЬГо-Рот! взаимодействия Однако если пользователь сконструировал свой тип с именем суре из базового типа, например, ИР1 1ИТ, то эти типы могут сочетаться в обменных функциях (см. п. 7.4.4). Некоторые компиляторы представляют символы в Гог1гап'е как структуры с длиной и указателем на фактический символ.
В такой среде ИР1 БЕИ0 или получающие запросы цолжны разыменовать указатель и достигнуть символа. 5.3.2. Преобразование данных Одна из целей МР1 — это поддержка параллельных вычислений в гетерогенных окружающих средах. Связь в гетерогенной окружающей среде может требовать преобразований данных. Здесь используется следующая терминология. Преобразование типов изменяет тип данных, например, округляя йоц51е (вещественный) к йпс (целый) числу. Преобразование представления изменяет двоичное представление значения данных в рамках одного и того же типа, например, изменяя значение байта или изменяя 32-разрядное число с плавающей запятой к 64-разрядному числу с плавающей запятой. МР1 коммуникации никогда не делают преобразования типов.
С другой стороны, МР! преобразует представление, когда данные передаются в окружающих средах с различными представлениями таких данных. МР! не определяет детальные правила этого процесса. Такое преобразование, как ожидается, сохранит целое число, логическое или значения знака и преобразует значение плавающей запятой к самому близкому значению, которое может 5ыть получено на соответствующей машине. При преобразовании плавающей запятой могут быть потери младших значащих разряцов. Преобразование целых чисел или знаков может также приводить к потерям разрядов, когда значение, представленное в одной системе, не может быть представлено в другой.
И~ключение, встречающееся в течение преобразования представления данных, приводит к эшибке в связи. Ошибка встречается или в посылающем действии, или получающем дей:твии, или в обоих. Если данные передавались без контроля типов (т. е. типа ИР1 НУТЕ), то двоичное пред=тавление байта, принятого приемником, идентично двоичному представлению байта, переданного источником. Эти значения байта одинаковые, независимо от того, выполняется пи источник и приемник в той же самой или в различных окружающих средах.
Здесь никакое преобразование представления данных не выполняется. Заметьте, что преобразование яредставления может встречаться, когда значения типа ИР1 СНАЯ переданы, например, от кодирования в ЕВСР1С (расширенного двоично-десятичного кода обмена информацией) до кодирования в АБСП. Никакие преобразования представления данных не нужны, когда МР1 программа выполчяется в однородной системе, где все процессы выполняются в той же самой окружающей :репе. Рассмотрим три предыдуших примера 5.2 — 5.4. Первая программа правильна, так как з и Ь являются вещественными массивами размера >= 1О. Если источник и приемник зыполняются в различных окружающих средах, то десять вещественных значений, которые язвлекаются из посылающегося буфера, будут преобразованы в вещественные числа на гчастке приемника прежде, чем опи будут записаны в буфере приема данных.
В то гремя как количество вещественных чисел (элементов), извлеченных из посылаюшегося 1уфера, равняется количеству вещественных чисел (элементов), записанных в буфере гриема, количество принятых байтов не равно количеству посылаемых байтов. Например, источник может использовать представление 4 байта и приемник представление 8 байтов зля вещественных чисел. Вторая программа ошибочна, и ее поведение неопределено. Третья программа правильна. Точно та же последовательность 40 байтов, которые гередавались из посылаюшегося буфера, будет записана буфере приема, даже если источник г приемник выполняются в различной окружающей среде.
Посланное сообщение имеет б5 б.е'. Семантика блокированных Яункций очно ту же длину (в байтах) и том же самом двоичном представлении, как полученное ;ообщение. Если а и Ь имеют различные типы или если они имеют тот же самый ип, но используются различные представления данных, то биты, записанные в буфере ~риема, могут кодировать значения, отличающиеся от значений, которые они кодировали 1 посылающемся буфере. Преобразование представления также применяется к оболочке сообщения.
Источник, ~азначение и тег — все целые числа, которые преобразовываются. МР1 не поддерживает связи межъязыкового общения. Поведение программы неопреде~ено, если сообщения посланы процессом на С и получены процессом на Рог!гав'е или ~аоборот. ьЗ.З. Некоторые замечания к преобразованию данных ЛР! не обеспечивает связь межъязыкового общения, потому что не имеется никаких :огласованных стандартов для соответствия между типами на С и типами рог!сап'а. ледовательно, МР1 приложения, которые смешивают языки, не будут переносимы.
Хотя МР1 не определяет интерфейсы между С и Рог$гап'ом, но следующие версии, как >жидается, обеспечат такие интерфейсы, чтобы программы Гогггап'а вызывали параллель~ые библиотеки, написанные на С, или связывались с серверами, управляющимися кодами ~а С (и наоборот). 1.4. Семантика блокированных функций )тот пункт описывает главные свойства посылающей и получающей функции, предста- ~ленные в п.
5.2. 1.4.1. Буферизация и безопасность 'ассмотренная версия блокированной функции приема данных ИР1 КЕСЧ является стан1артной. Она возвращает управление только после того, как буфер приема данных получит :ообщен не, Рассмотренная версия блокированной передающей функции ИР1.ЗЕИВ также является :тандартной. Программа не возвращает управление, пока данные сообщения и их оболочка ~е будут безопасно записаны в промежуточный буфер и источник будет свободен к доступу ~ посылающийся буфер.
Блокированная передача могла бы завершаться, как только сообгцение буферизовалось, враже если нет соответствующего получателя. Буферизация сообщения "развязывает" посы~аюшее и получающее действия. С другой стороны, буферизация сообщения может быть 1орога, поскольку это влечет за собой дополнительное копирование "память — памятно и требуется распределение памяти для буферов. МР! предлагает выбор разных версий бло~ярованной связи (буферизированный, синхронный, по готовности), которые допускают, ~тобы пользователи управляли выбором протокола связи. Способы описаны в п.
5.12. В хорошо построенных программах применение блокированной передачи приводит к юлезному эффекту регулятора. Рассмотрите случай, когда производитель неоднократно производит новые значения и посылает их потребителю. Лопустите, что производитель ~роизводит новые значения быстрее, чем потребитель может потреблять их. Если исполь~уются блокированная посылка, то производитель будет автоматически регулироваться, югда пространство буфера недоступно.
В плохо построенных программах блокированная ~ередача может приводить к ситуации е1еае1!ос!г, где все процессы заблокированы. Такие ~рограммы могут нормально закончить, когда достаточное пространство буфера доступно, ю будут терпеть неудачу на системах, которые делают меньшее количество буферизации ~ля когда наборы данных (и размеры сообщения) увеличены. Так как любая система ис~ерпает буферные ресурсы, если размеры сообщения увеличены, и некоторые выполнения югут испытывать недостаток в буферизации, МР1 рекомендует безопасным программам ~е полагаться на буферизацию системы. й.
Ротко-Рогп$ взаимодействия МР1 не предписывает безопасный тип программирования. Пользователи свободны в выборе разных типов обменных функций. Следующие примеры иллюстрируют безопасные фрагменты программ. Пример 5.5. Обмен сообщениями. МР1 Сошш гапК(сошш, йгапК); Тт(гапК == 0) ( МР1 Яепб(вепбЬиТ, соипс, МР1 ГНАТ, 1, МР1 Весч(гесчЬи1, соипс, МР1 ГьОАТ, 1, е1ве зТ(гапК == 1) ( МР1 Весч(гесчЬи~, соипс, МР1 Г1.ПАТ, О, МР1 Яепб(вепбЬи1, соипс, МР1 ГЕСАТ, О, ) сап, сошш); саб, сошш, йвсасив); саб, сошш, йвсаииз); саб, сошш); Эта программа безопасна и будет всегда завершаться правильно, даже если никакое пространство буфера не доступно для данных. Пример б,б.
Попытка обмена сообщениями. МР1 Сопяп гапК(сошш, йгапК); 11(гапК == О) ( МР1 Кесч(гесчЪи1, соипс, МР1 ГЕОАТ, 1, МР1 Яепб(вепбЬиХ, соипс, МР1 ГЕРАТ, 1, е1ве Н(гапК = = 1) ( МР1 йесч(гесчЬиТ, сопли, МР1 ГНАТ, О, МР1 Яепб(вепбЬи1, соипс, МР1 ГьОАТ, О, саб, сошш, взсасив); сап, сошш); саб, сошш, взсасив); сай, сошш); Получающая функция нулевого процесса должна вначале принять данные от первого процесса, затем уже послать ему данные и может завершиться, только если первый процесс выполнит посылку данных нулевому.
Аналогично, первый процесс вначале ждет данных от нулевого и только после этого пошлет ему данные. Эта программа неправильная и будет находиться в состоянии беаб!осК. Пример 5.7. Обмен, который полагается на буферизацию. МР1 Сошш гапК(сошш, йгапК); Н(гапК == 0) С МР1 Яепб(зепбЬиТ, соипс, МР1 ГЬОАТ, 1, сап, МР1 йесч(гесчЬиХ, соипс, МР1 ГЮАТ, 1, пай, е1ве Ат(гапК = = 1) ( МР1 Яепб(зепбЬиХ, сопли, МР1 ГНАТ, О, саи, МР1 йесч(гесчЬиТ, соипс, МР1 ГЕОАТ, О, пай, сошш); сошш, ввсасиз); сошш); сошш, йвсасив); Сообщение, посланное каждым процессом, должно копироваться где-нибудь, чтобы посылающие функции завершились и запустились получающие функции.
Лля завершения программы необходимо что бы, по крайней мере, одно из двух сообщений буферизовалось. Таким образом, эта программа преуспеет, только если система связи будет буфернзировать в своем внутреннем буфере, иначе зайдет в состояние беаб!осК. Успех ее будет зависеть от количества пространства буфера, доступного в частном выполнении.
С небольшим массивом данных зта программа выполнится правильно, но она ненадежна. 5.4. Се.кантика блокироааннмх функцай Безопасность — очень важный момент в проекте программ передачи сообщений. МР1 предлагает много вариантов, которые помогают в написании безопасных программ, в дополнение к методам, которые были описаны. Неблокированная передачи сообщений, как описано в п. 5.7, может использоваться, чтобы избежать потребности в буферизации посылаемых сообщений. Это устраняет блокировки из-за недостатка пространства буфера я потенциально улучшает выполнение, позволяя избегать непроизводительных затрат распределения буферов и копирования сообщений в буфера.