В.Д. Корнеев - Параллельное программирование в MPI (1162616), страница 39
Текст из файла (страница 39)
7.7. Абсолютный адрес ИР1 Оапасуре СуреС4) = (МР1 СНАП, МР1 ОООВ1Е, МР1 СНАП, МР1 ОВт; 1пс Ь1осК1епМ = (1,б,7,1); МР1 Айпп с)1зРМ; /* Вычисление смешений компонент структуры */ НР1 Аойгезз(рагпйс1е, йпйзрГО)); ИР1 АсЫгезз(рагсйс1е(0) .а, АойзрГ13); ИР1 Аоогезз(рагсйс1е(ОЗ.Ь, АЫзрГ23); ИР1 АИгезз(рагсйс1е(13, Аойзр(33); Хог(1 = 3;1 >= 0;1 — ) 61зрЫ -= йтзр[03; /л Построение типа данных пля структуры х/ ВР1 Туре зсгпсс(4, Ь1осК1еп, отер, суре, АРагс1с1есуре); ИР1 Туре сошвйс(ФРагстс1есуре); /л Передача элементов массива е/ МР1 Яепп(рагпйс1е, 1000, Рагтйс1епуре, Везп, пай, сопнн); Две функции ниже могут использоваться для определения нижней и верхней границы типа данных. йР1 ТУРЕ ЬВ(йасасуре, с(1зр1асешепс) 1М пасасуре тип панных 00Т бйзр1асешепс смешение нижней границы тнс МР1 Туре 1Ь(МР1 Оасасуре оасасуре, МР1 А1псе отзр1асевепс) ИР1 ТУРЕ ЬВ(ОАТАТУРЕ, 01ЯР|АСЕМЕИТ, 1ЕНВОВ) 1ИТЕСЕН ОАТАТУРЕ, 01ЯРЬАСЕМЕМТ, 1ЕВВОН МР1 ТУРЕ 1,В возвращает нижнюю границу типа (аасасуре), в байтах, относительно начала типа (аасасуре).
АР1 ТУРЕ ОВИатапуре, Жзр1асешепп) 1й оасасуре тип данных 00Т айзр1асевепс смешение верхней границы 1нс МР1 Туре иЬ(МР1 Оасасуре оасасуре, МР1 Атлс» ййзр1асешепс) МР1 ТУРЕ ОВ(ОАТАТУРЕ, 01ЯРЬАСЕМЕМТ, 1ЕВВОН) 1йТЕОЕВ ОАТАТУРЕ, 01ЯРЬАСЕМЕМТ, 1ЕВВОВ МР1 ТУРЕЛВ возвращает верхнюю границу типа относительно начала типа в байтах. 7,7. Абсолютный адрес Рассмотрим пример 7.21. Для вычисления "аЬзо!псе" адресов компонент структуры испольнуются запросы к МР1 АООВЕББ, затем вычитается начальный адрес массива, чтобы вычислить относительные смещения.
Когда передающая функция выполнена, начальный адрес кассина добавляется назад, чтобы вычислить адрес посылаемого буфера. Этой избыточной нрнфметики можно было бы избежать, если бы "аЬзо!псе" адреса использовались в произнодном типе данных, и нулевой "айдтезз" передавался как аргумент буфера в передающую функцию. МР1 поддерживает использование такого ааЬзо!пте" адреса в производном типе данных. Аргументы смешения, используемые в строителях типов данных, могут быть ааЪзо)пФе" адреса, т.
е. адреса, возвращенные запросами к МР1 АООВЕБЯ. Нулевой адрес обозначается длн функций связи передачей константы МР1 ВОТТОМ как аргумента буфера. В отличие от 152 7. Определяемые пользователем типы даиные и упаковка дапньье производного типа данных с относительными смещениями, использование "аЬео1п1е" адреса ограничивает использование определения структуры, для которой зто было создано. Пример 7.24. Пример 7.21 изменен, здесь используются абсолютные адреса вместо отно сительных смешений.
Яьгпсп Рагьвпгпсь сЬаг с1авн; бопЫе о(б); сЬаг Ь (7); всгпсь Ратпвьгпсс рагп1с1еь10003; 1пс 1, денс, гапк; МР1 Савв с аппп; /е Построение типа данных описываювих структуру */ МР1 Оататуре Рагс1с1етуре; МР1 Оатапуре Суре(33 = 1МР1 СНАП, МР1 ООПВЬЕ, МР1 СНАЯ; 1пп Ыоск1еп(3) = (1, б, 71; МР1 Айпп Жвр(33; /л Вычисление адресов компонент в 1-й структуре */ МР1 АеЫгевв(рагс1с1е,д1вр); МР1 АеЫгевв(рагс1с1е(0).о, д1вр+1); МР1 АеЫгевз(рагп1с1еГОД.
Ь, дтвр+2), /е Построение типа данных дпя 1-й структуры л/ МР1 Туре всгпсс(З, Ыоск1еп, 61вр, суре, йРагс1с1есуре); МР1 Туре совв1С(ФРагп1с1ееуре); /а Послать весь массив */ МР1 Яепьр(МР1 ВОТТОМ, 1000, Рагсйс1епуре, деве, таб, соппп); /ь класс частицы е/ /ь координаты частицы е/ /е некоторая дополнительная информация э/ буфер связи, определяемый аргументами Ьптт, сопле и «ьапапуре — все внутри того же самого последовательного хранения; начальный адрес буфера, обозначенный Ьптт, равен МР1 ВОТТОМ, сопле=1 и все адреса в отображении типа дасасуре — абсолютные адреса формы у+ь, где у — абсолютны1 адрес, вычисленный МР1 АООНЕЯЯ, 1 — целочисленное смешение и у+1 находится на ток же самом последовательном хранении, как ч.
7.8. Упаковка и распаковка данных Некоторые существующие коммуникационные библиотеки, типа Р1/М и Рагшасп, имеют ' упаковочные н распаковочные. функции для посылки данных состоящих из нескольких пе =межных участков. В них приложение явно упаковывает данные в прилегающий буфер В системах с простой адресацией прикладная программа может выбрать произвольны1 адрес как значение МР1 ВОТТОМ на С (или адрес переменной МР1 ВОТТОМ в Рогегап'е). Запросы к МР1 АООНЕЯЯ(1осас1оп, адьргевв) возвращают смещение 1осасйоп относительно МР1 ВОТТОМ. Использование адресов и смешений в МР1 лучше всего понято в контексте просто1 адресации.
Тогда иаеЫгезя" места, вычисленного запросами к МР1 АООНЕЯЯ, может быть регулярным адресом этого места (или этого смещения), и арифметика целых чисел па МР1 иаьЫгеез" выдает ожидаемый результат. Переменные принадлежат тому же самону ' последовательному хранению, если они принадлежат тому же самому массиву, той же ~~ самой СОММОМ области в Рогегапе'е или к той же самой структуре на С. Приложения могут ~ ограничивать использование адресов так, чтобы адресная арифметика заключалась внутре,, последовательного хранения. А именно, в запросе связи также есть 78.
Упаковка и распаковка даннык перед их посылкой и распаковывают их из прилегающего буфера после получения. Производный тип данных, описанный в предыдущих пунктах этой главы, позволяет в большинстве случаев избегать явной упаковки и распаковки данных. Прикладная программа определяет расположение данных, которые будут посланы или получены, и МР1 непосредственно обращается к буферу, состоящему из нескольких несмежных участков. Упаковочные/распаковочные операции обеспечивают совместимость с предыдущими библиотеками.
Также они обеспечивают некоторые функциональные возможности, которые иначе не доступны в МР1. Например, сообщение может быть получено отдельными частями, где принимающая операция, выполненная для более поздней части, может зависеть от содержания прежней части. Другое использование — то, что упаковочные и распаковочные операции облегчают развитие дополнительных библиотек связи. 1псоипс, басасуре, оисЬи1, оисззхе, роззсзоп, сошш) входной буфер количество входных конпонент тип каждой входной компоненты выходной буфер размер выходного буфера, в байтах текушая позиция в буфере, в байтах коммуникатор (сошшип1сасог) для упакованного сообшения 1пс МР1 РасК(чозе)в зпЬи1, 1пс зпсоипС, МР1 Расасуре баСасуре, чо1е) воисЬи1, 1пс оисз1ке, 1пс вроз1с1оп, МР1 Сопш сошш) ИР1 РАСК(ХМВОР, 1МСОРМТ, РАТАТ1'РЕ, 00ТВОР, 00ТЯХЕЕ, РОЯ1Т1ОМ, СОММ, ХЕВЮВ) <Суре> ХМВ0Р(в), 00ТВРГ(в) ХМТЕОЕЙ 1МСОРМТ, РАТАТУРЕ, ОРТЯ1ЕЕ, РОЯ1Т1ОМ, СОИМ, ХЕВВОВ МР1 РАСК упаковываетсообщение, указанное 1пЬит, 1псоипс, басасуре, соппп в пространство буфера, указанное оисЬит и оисз1ке, Входным буфером может быть любой буфер связи, позволяемый в МР1.ЯЕЮ.
Выходной буфер — прилегающая область памяти, содержащая оисз1ке байт, начинающийся по адресу оисЬи1. Значение величины роззс1оп — первая позиция в выходном буфере, который используется для упаковки. Аргумент роз1с1оп увеличивается на размер упакованного сообщения так, чтобы он мог использоваться как вход для последующего запроса к МР1 РАСК. Аргумент сошш — переключатель каналов, который будет впоследствии использоваться для посылки упакованного сообщения. МР1 0МРАСК(тпЬи1, 1М 1пЬиХ 1М 1пз1ке 1МОРТ роззстоп 00Т оисЬиХ 1М оиссоипс 1М базасуре 1М сонин 1ис МРХ РпрасК(чо1е)* тпЬиХ, 1пс 1пзтхе, 1пс вроз1сгоп, чо1б воисЬий, 1пс оиссоипС, МР1„0асасуре дасаСуре, МР1 Санни сонин) ИР1 ОМРАСК(ХМВРР, 1МЯ1ЕЕ, РОЯ1Т1ОМ, ОРТВРР, ОРТСОРМТ, РАТАТУРЕ, СОИМ, ХЕВЮВ) <суре> ХМВРР(в), ОРТВОР(в) ХМТЕСЕВ ХМЯХЕЕ, РОЯХТХОМ, ОРТСОРМТ, РАТАТУРЕ, СОИМ, 1ЕВЮВ МР1 РАСКХ1пЬи1, 1М 1пЬи1 1М 1псоипг.
1М басасуре 00Т оиСЬи1 1М оисз1хе 1МОРТ роз1сзол 1М сонян 1пз1ке, роз1с1оп, оисЬит, оиссоипс, е)асасуре, санни) входной буфер размер входного буфера, в байтах текушая позиция, в байтах выходной буфер количество компонент, подлежаших распаковке тип каждой выходной компоненты коммуникатор (сошшип1сасог) для упакованного сообшения 154 7, Определяемые пользователем типы данные и упаковка данных МР1ЛМРАСК распаковывает сообщение в буфер приема, указанный аргументами опсЬп1, опссоппс, бапасуре из пространства буфера, указанного аргументами хпЬц1 и 1пвйке.
Выходной буфер может быть любым буфером связи, позволяемым в МР1 ЯЕСЧ. Входной буфер — прилегающая область памяти, содержащая 1пв хне байт, начинающийся по адресу 1цЬп1. Значение аргумента ров!с!оп — позиция во входном буфере, где начинается очередная распаковка. Значение ров(с!оп увеличивается размером упакованного сообщения так, чтобы оно могло использоваться как вход для последующего запроса к МР1ЛМРАСК. Аргумент сопя — переключатель каналов, используемый, чтобы получить упакованное сообщение. Упаковочные и распаковочные операции имеют аргумент переключателя каналов, чтобы облегчить преобразование данных в источнике в гетерогенной окружающей среде. Например, они учтут выполнение, которое использует формат ХПК для упакованных данных в гетерогенной области связи, и не делают никакого преобразования данных, если область связи однородна.