В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 17
Текст из файла (страница 17)
прием данных от любой группы пропессов не существует. Аргумент яопгсе, если он отличен от МР1 АМУ ЯООВСЕ, определен как ранг (целочисленный номер) внутри группы процессов, связанных переключателем каналов определенным как Тпсгасоииппйсасог. диапазон значений для аргумента вопгсе — (О,...,ц-1) (ИР1 АМУ ЯООВСЕ), где и — число процессов в этой группе.
Этот диапазон включает ранг приемника сообщения (е)еяс): если переключатель каналов — зпсгасоииппзсасог, то процесс может получать сообщение от самого себя. Диапазон значений для аргумента саЕ— (О,...,УВ)(МР1 АМУ ТАО). 5.2.3. Статус (состояние) полученных данных Источник и тег, записанные в оболочке полученного сообщения, возвращаются функцией МР1 ВЕСЧ аргументом ясаспв. Тип переменной ясаспя определен МР1 как переменная типа ИР1 Ясаспя. Переменные ясаспя — это имена, заданные пользователем.
На С статус полученных данных представляется структурой типа МР1 Бсаспя, которая содержит три поля с именами МР1 ЯООВСЕ, МР1 ТАС и МР1 ЕВВОВ (структура может содержать дополнительные поля). Таким образом, поля МР1 БООВСЕ, МР1 ТАС и МР1 ЕВЮВ содержат соответственно источник, тег и код ошибки полученного сообщения.
На Рогсгап'е стаепус — это массив целых чисел длины МР1ЯТАТУЯ Я12Е. Трн константы МР1 БООВСЕ, МР1 ТАС и МР1 ЕВЮ — индексы входов, которые хранят источник, тег и поле ошибки. Таким образом, константы МР1.500ВСЕ, МР1 ТАС и МР1 ЕВВОВ содержат соответственно источник, тег и код ошибки полученного сообщения. Источник и/или тег полученного сообщения не могут быть известны, если использовались значения групповых/ого символов/а в получающей функции. Также, если многократные запросы закончены единственной МР1 функцией (см.
п. 5.9), различный код ошибки может быть возвращен для каждого запроса. (Обычно код ошибки возвращается как значение функции на языке С и как значение аргумента 1ЕВВОВ на Рогкгап'е.) Запрос для получения данных (МР1.ВЕСН) не определяет размер поступающего сообщения, а только его верхнюю границу. Статус имеет также аргумент, через который возвращается информация относительно длины полученного сообщения. Однако эта информация непосредственно не доступна как поле переменной статуса, а доступна с помощью запроса к функции МР1 ОЕТ СООМТ, ЧР! ОЕТ СООМТ(ясаспя, басасуре, соппс) 1М ясаспя статус принятых данных 1М йасасуре тип принятых элементов )0Т соппс количество принятых элементов 1пс мР1 Сес соппс(МР! Бсаспя «ясасця, мР1 Оасасуре е!асасуре, Тпс есоппс) 1Р! СЕТ СООМТ(ЯТАТОЯ, ОАТАТ1'РЕ, СООМТ, 1ЕВЮВ) 1МТЕСЕВ ЯТАТОЯ(МР1 БТАТОЯ Я!ЕЕ), 0АТАТУРЕ, СОУМТ, 1ЕВЮВ МР! ОЕТ СООМТ берет как входной параметр ясаспя соответствующего МР1ВЕСЧ и вычисляет число полученных элементов.
Количество полученных элементов возвращено в переменной соппс. Аргумент е)асасуре должен быть таким же, как и аргумент в получаощей функции МР1 ВЕСУ, к статусу которой осуществляется доступ. (В п. 5.4, поясняется, ~то МР1 ОЕТ СООМТ может возвращать, в некоторых случаях, значение МР1ЛМОЕР1МЕО.) о. Ротного-Роем взаимодействия 5.2.9. Некоторые замечания к приему данных Заметьте, что есть асимметрия между посылающей и получающей функцией. Получающая функция может принимать сообщения из произвольного источника, но посылающая функция должна определять уникальный приемник. Это соответствует "'рпяп" механизму связи, где передача данных произведена датчиком, а не "рп11" механизм, где передача данных произведена приемником.
Источник, равный назначению, допускается, т.е. процесс может посылать сообщение =ебе. Однако для такой связи, чтобы правильно выполнилась операция, требуется, чтобы "ообщение буферизовалось системой между завершением посылающего запроса и началом получающего запроса. Количество пространства буфера зависимо от выполнения. Следовательно, такая передача ненадежна и не переносима. Посылка сообщения самому себе в "тандартном режиме блокированными посылающей и получающей функциями может приводить к с1еа<Поск'у.
Получающая функция должна определить тип элементов поступающего сообщения и верхней границы числа элементов. В некоторых случаях процесс может ожидать отдельные сообщения различных длин или типов, в других — только одно сообщение, но это =ообщение имеет неизвестный тип или длину. Ксли возможных видов поступающих сообщений немного, то каждый такой вид может быть идентифицирован различным значением гега. Функция МР1 РЮВЕ, описанная в п. 5.9, может использоваться, чтобы проверить по=тупаюшие сообщения без их фактического получения.
Процесс получения может сначала проверить значение тега поступающего сообщения и затем получать данные с этим тегом. В наиболее общем случае не возможно представить каждый пакет сообщения с различным значением тега. Тогда можно использовать двухфазный протокол: датчик сначала посылает сообщение, содержащее описание данных, затем сами данные. Гарантируется, что два сообщения прибудут в правильном порядке и по назначению, как описано в и. 5.4.
МР1 предлагает ряд механизмов для соответствия поступающих сообщений получаюдим функциям. В общем случае теги данных и переключатели каналов достаточны для зринимающей функции, чтобы получать нужные данные. Оба параметра позволяют разйить связь на различные классы. Теги являются неидеальной зашитой, так как групповой символ получения (МР1 АМУ ТАС) нарушает защиту, обеспеченную тегами, в то время сак переключатели каналов распределены и управляются специальнымн, более надежными зействиями. Предпочтительно использовать переключатели каналов, чтобы обеспечить зацищенные области связи для модулей или библиотек.
Теги применяются, чтобы различать закеты сообщений внутри одного модуля или библиотеки, Часто параметры источника или тега достаточно согласовать, чтобы посылка и получезие данных были правильными. Однако предпочтительно избегать использования группозых символов всякий раз, когда возможно. Более узкие критерии соответствия параметров зриводят к более надежному коду, с меньшим количеством возможностей несовпадения :ообшения или недетерминированного цовецения.
Более узкие критерии соответствия параметров — это шаг к улучшенному выполнению программы. $.3. Соответствие типов и преобразование данных $.3.1, Соответствие типов передача сообщения состоит из следующих трех последовательных стадий: 1. Данные копируются вне посылающегося буфера, и сообщение собирается в промежуточный буфер. 2. Сообщение передается от источника на приемник. 3. Данные копируются из поступившего сообщения в буфер для приема данных. оответствие типов соблюдается на каждой из этих стадий. Тип каждой переменной ~ буфере датчиков согласовывается с типом, указанным в посылающей функции. Тип, 5.3. Соответствие тинов и преобразование данных указанный в посылающей функции, согласовывается с типом, указанным в получающей функции.
И, наконец, тип каждой получаемой переменной согласовывается с типом буфера, указанным в получаемой функции. Лля точного соответствия типов учитываются два момента: соответствие типов переменных базового языка типам, указанными в функциях связи и соответствии типов между источником и приемником. Типы в посылающей и получающей функциях соответствуют, если онн обе определяют идентичные имена типа, т.е. МР1 1ИТ соответствует МР1 1МТ, МР1 000ВЕŠ— МР1 ООВВЕЕ и т.д.
Одно исключение нз этого правила то, что тип МР1 РАСКЕР может согласовывать любой другой тнп (см. и. 7.8). Тип переменной соответствует типу, указанному в функции связи, если имя басапуре, используемое в функции, соответствует основному типу переменной программы пользователя. Например, параметр МР1 1МТ в функции соответствует переменной на языке С типа 1пп (целое). Таблицы, показывающие это соответствие для Гог1гап'а и С, представлены в и. 5.2.2.
Имеются два исключения нз этого правила: вход с типом МР1 ВУТЕ н МР1 РАСКЕВ, которые могут использоваться, чтобы согласовывать любой байт хранения независимо. от типа переменной, которая содержит этот байт. Тип МР1 ВУТЕ предписывает, чтобы передали двоичное значение байта без изменения. Тип МР1 РАСКЕО используется, чтобы послать данные, которые были явно упакованы запросами к МР1 РАСК, нлн получить данные, которые будут явно распакованы запросами к МР1ЛМРАСК (см.
п. 7.8). (В данном случае не нужно путать согласованность имен типов и согласованность двоичных значении данных, т.е. МР1 ВУТЕ в передающей функции должен быть согласован с МР1 ВУТЕ в принимающей функции, МР1 ВУТЕ не может быть согласован, например, с МР1 1ИТ). Следующие примеры поясняют соответствие типов. Пример 5,2. Источник и приемник правильно определяют соответствие типов. МР1 Соппп гапК(соппп, гапК); 11(гапК == 0) МР1 Бепб(а, 10, МР1 РЕОАТ, 1, Саб, сопев); в1ве11(гапК == 1) МР1 Веси(Ь, 15, МР1 ГНАТ, О, са8, соппп, всаспв); Этот код правилен, если а и Ь вЂ” вещественные массивы размера >= 10.