Краткий обзор: назначение, особенности, перспективы
- последовательный алгоритм подвергается декомпозиции (распараллеливанию), т.е. разбивается на независимо работающие ветви; для взаимодействия в ветви вводятся две дополнительных нематематических операции: прием и передача данных.
- распараллеленный алгоритм записывается в виде программы, в которой операции приема и передачи записываются в терминах конкретной системы связи между ветвями.
- через разделяемую память , синхронизация доступа ветвей к такой памяти происходит посредством семафоров,
- в виде сообщений .
- разделяемая память на не-SMP-комплексах — посредством организации единого виртуального адресного пространства на изолированных друг от друга физических ОЗУ; такая имитация аппаратными средствами нередко применяется на NUMA-машинах;
- на SMP-машине вырожденным каналом связи для передачи сообщений служит разделяемая память.
Следовательно, единый интерфейс программиста может быть создан, тем не менее долгое время создатели компьютеров и операционных систем шли разными путями. Например, для работы с семафорами и разделяемой памятью в Windows, в Юниксах 4.4BSD и SVR4 примерно одни и те же действия представлены разными наборами системных вызовов. В мире локальных/глобальных сетей стандарт вроде бы выработан — это TCP/IP. Однако для работы с внутримашинными сетями, где состав абонентов и маршрутизация трафика жестко фиксированы, а вероятность доставки пакетов равна 100%, универсальность и гибкость TCP/IP отрицательно сказываются на скорости, поэтому для MPP-машин интерфейсы программиста создаются индивидуально (или, вернее, создавались индивидуально до тех пор, пока не появился MPI).
Воеводин В. В. — Суперкомпьютеры — Технология MPI . Часть 1
- мобильным,
- эффективным,
- надежным,
Параллельное приложение Средства быстрой разработки приложений (RAD)
Распараллеливающие препроцессоры
M P I
разделяемая память
и семафоры индивидуальные интерфейсы
с передачей сообщений TCP/IP SMP-машины MPP-машины сети
- библиотека программирования для языков Си, Си++ и Фортран,
- загрузчик исполняемых файлов.
Для MPI принято писать программу, содержащую код всех ветвей сразу. MPI-загрузчиком запускается указываемое количество экземпляров программы. Каждый экземпляр определяет свой порядковый номер в запущенном коллективе, и в зависимости от этого номера и размера коллектива выполняет ту или иную ветку алгоритма. Такая модель параллелизма называется Single program/Multiple data ( SPMD ), и является частным случаем модели Multiple instruction/Multiple data ( MIMD ). Каждая ветвь имеет пространство данных, полностью изолированное от других ветвей. Обмениваются данными ветви только в виде сообщений MPI.
Все ветви запускаются загрузчиком одновременно как процессы Юникса. Количество ветвей фиксировано — в ходе работы порождение новых ветвей невозможно. Если MPI-приложение запускается в сети, запускаемый файл приложения должен быть построен на каждой машине.
Параллельные процессы MPI
Ниже, в следующих трех разделах, будут вкратце рассмотрены некоторые функциональные возможности MPI, причем упор будет сделан не на том, что они делают (все аналоги MPI так или иначе делает то же самое), а на том, как они это делают, какие нетривиальные решения были найдены для выполнения типовых действий.
- Способ зацепления процессов — в случае неодновременного вызова двумя процессами парных функций приема и передачи могут быть произведены:
- Автоматический выбор одного из трех нижеприведенных вариантов;
- Буферизация на передающей стороне — функция передачи заводит временный буфер, копирует в него сообщение и возвращает управление вызвавшему процессу. Содержимое буфера будет передано в фоновом режиме;
- Ожидание на приемной стороне,
завершение с кодом ошибки на передающей стороне; - Ожидание на передающей стороне,
завершение с кодом ошибки на приемной стороне.
- Блокирующий — управление вызывающему процессу возвращается только после того, как данные приняты или переданы (или скопированы во временный буфер);
- Неблокирующий — управление возвращается немедленно (т.е. процесс блокируется до завершения операции), и фактическая приемопередача происходит в фоне. Функция неблокирующего приема имеет дополнительный параметр типа «квитанция». Процесс не имеет права производить какие-либо действия с буфером сообщения, пока квитанция не будет «погашена»;
- Персистентный — в отдельные функции выделены:
- создание «канала» для приема/передачи сообщения,
- инициация приема/передачи,
- закрытие канала.
Таким образом, MPI — весьма разветвленный инструментарий. Приведу цитату из раннего себя: «То, что в конкурирующих пакетах типа PVM реализовано одним-единственным способом, в MPI может быть сделано несколькими, про которые говорится: способ А прост в использовании, но не очень эффективен; способ Б сложнее, но эффективнее; а способ В сложнее и эффективнее при определенных условиях «.
- broadcast: один-всем,
- scatter: один-каждому,
- gather: каждый-одному,
- allgather: все-каждому,
- alltoall: каждый-каждому.
if( myRank == 0 ) < for( i=1; i < numLoops; i++ ) MPI_Send( . , i, . ); >else MPI_Recv( . , 0, . );
- к разделяемой памяти и семафорам на SMP-машине, при этом происходит одно копирование в разделяемую память и numLoops-1 копирований из нее просто функцией memcpy() ;
- к TCP/IP при работе в сети: в качестве адреса получателя при передаче используется т.н. «широковещательный», с «-1» в поле адреса машины.
В MPI хорошо продумано объединение ветвей в коллективы. В сущности, такое деление служит той же цели, что и введение идентификаторов для сообщений: помогает надежнее отличать сообщения друг от друга. В большинстве функций MPI имеется параметр типа «коммуникатор», который можно рассматривать как дескриптор (номер) коллектива. Он ограничивает область действия данной функции соответствующим коллективом. Коммуникатор коллектива, который включает в себя все ветви приложения, создается автоматически при старте и называется MPI_COMM_WORLD.
Идентификаторы программист назначает сообщениям вручную, и существует вероятность, что вследствие его ошибки два разных сообщения получат одинаковые идентификаторы. Коллективы создаются функциями самого MPI, так, чтобы гарантированно избежать случайных совпадений.
В качестве идентификатора ожидаемого сообщения функции приема может быть передан т.н. «джокер» — принять первое пришедшее сообщение независимо от его идентификатора и/или отправителя. Такой вызов может по ошибке перехватывать и те сообщения, которые должны быть приняты и обработаны в другом месте ветви. Для коммуникаторов «джокера» не существует, поэтому работа разных функций через разные коммуникаторы гарантированно предохраняет их от взаимных краж информации: коммуникаторы являются несообщающимися сосудами.
Коммуникаторы, помимо собственного номера и состава входящих в них ветвей, хранят и другие данные. Например, кроме обязательной линейной нумерации, ветвям коллектива может быть дополнительно назначена нумерация картезианская или в виде произвольного графа — это может оказаться удобным для решения некоторых классов задач. Коллективу может быть назначена функция-обработчик ошибок взамен назначаемой по умолчанию. Пользуясь механизмом «атрибутов», для коллектива пользователь может завести набор совместно используемых его ветвями данных.
О типах передаваемых данных MPI должен постольку-поскольку при работе в сетях на разных машинах данные могут иметь разную разрядность (например, тип int — 4 или 8 байт), ориентацию (младший байт располагается в ОЗУ первым на процессорах Intel, последним — на всех остальных), и представление (это, в первую очередь, относится к размерам мантиссы и экспоненты для вещественных чисел). Поэтому все функции приемопередачи в MPI оперируют не количеством передаваемых байт, а количеством ячеек, тип которых задается параметром функции, следующим за количеством: MPI_INTEGER, MPI_REAL и т.д. Это переменные типа MPI_Datatype (тип «описатель типов», каждая его переменная описывает для MPI один тип). Они имеются для каждого базового типа, имеющегося в используемом языке программирования.
Однако, пользуясь базовыми описателями, можно передавать либо массивы, либо одиночные ячейки (как частный случай массива). А как передавать данные агрегатных типов, например, структуры? В MPI имеется механизм конструирования пользовательских описателей на базе уже имеющихся (как пользовательских, так и встроенных).
В MPI сняты оба этих ограничения! Это позволяет весьма причудливо «вырезать», в частности, фрагменты матриц для передачи, и размещать принимаемые данные между собственных. В спецификации MPI приведен пример создания пользовательского описателя типа, передача матрицы с использованием которого приводит к ее транспонированию.
Выигрыш от использования механизма конструирования типов очевиден — лучше один раз вызвать функцию приемопередачи со сложным шаблоном, чем двадцать раз — с простыми.
- Взаимодействие между приложениями. Поддержка механизма «клиент-сервер». Станет возможным писать на MPI не только расчетные математические задачи, но и системы массового обслуживания (базы данных и проч.).
- Динамическое порождение ветвей. Для программирования расчетных задач это не нужно (хотя многие по привычке хотели бы иметь в MPI аналоги fork() и spawn() ).
Действительно, не имеет смысла запускать ветвей больше чем. и нет особого вреда в том, чтобы запускать ветвей меньше, чем. реально имеется процессоров, не так ли? Процессор не станет работать в N раз быстрее, если вместо одной ветви на нем запустить N ветвей. И наоборот, ветвь, для которой не найдется работы, в «спящем» состоянии будет потреблять сущие крохи от процессорного времени.
Однако такая возможность однозначно необходима для написания системы массового обслуживания. - Для работы с файлами создан архитектурно-независимый интерфейс. Это имеет значение, особенно если диск находится на одной ЭВМ, а ветвь, которая должна с ним работать — на другой. В отсутствие такого интерфейса пересылку данных приходится либо организовывать вручную, либо полагаться на сетевые возможности операционной системы (NFS, Parix и т.д.). По сравнению и с тем, и с другим, MPI гарантирует лучший баланс между универсальностью и быстродействием.
- Сделан шаг в сторону SMP-архитектуры. Теперь разделяемая память может быть не только каналом связи между ветвями, но и местом совместного хранения данных. Для этого ветви делегируют в MPI т.н. буфера-«окна». Интерфейс выполнен так, чтобы в-принципе его можно было реализовать и через передачу сообщений на не-SMP-комплексах. MPI автоматически поддерживает идентичность содержимого всех «окон» с одинаковым идентификатором.
Для этого механизма придуман термин «One-sided communications» («односторонние коммуникации»), так как ветви-получателю не требуется явно вызывать функцию приема для получения новой информации; функция передачи в ветви-отправители осуществляет «Remote memory access» («удаленный доступ к памяти», сокращенно RMA).
- одна и та же решаемая задача: обеспечение межпроцессовой связи,
- методика программирования: SPMD с передачей сообщений,
- методика использования: библиотека для Си/Фортрана + загрузчик,
- мобильность инструмента и, как следствие, мобильность создаваемых программ.
- интерфейс программиста проще и примитивнее,
- интерфейс пользователя сложнее и запутаннее,
- предусмотрено динамическое размножение ветвей (есть в MPI-2),
- возможно взаимодействие приложений, запущенных одним и тем же пользователем (есть в MPI-2),
- загрузчик приложений, создающий собственно Виртуальную Параллельную Машину, является постоянно запущенным (полезно для исследовательских целей); в отличие от MPI, где срок жизни загрузчика строго совпадает со сроком жизни одного конкретного приложения (более простое, надежное и компактное решение),
- PVM старше на 6 лет, но не продвигается производителями ЭВМ на роль единого стандарта.
Подробнее о PVM читайте тут.
- Модель программирования межпроцессных связей через общую память с синхронизацией семафорами — базовая для SMP- и однопроцессорных компьютеров. Функции работы с Shared memory непосредственно входят в состав каждой многозадачной операционной системы. В пределах одного компьютера все остальные средства межпроцессовой коммуникации реализуются через SHM, и потому заведомо являются менее быстрыми,
- В модели с общей памятью совместно используемые данные хранятся в такой памяти в единственном экземпляре, без создания локальных копий для каждой ветви приложения. Ветви, работающие с такими данными, затрачивают незначительное время на синхронизацию доступа к данным, и в-целом соотношение скорости коммуникаций и скорости вычислений в модели с общей памятью выше, чем в модели с передачей сообщений. Следовательно, класс задач, пригодных к распараллеливанию в SHM, в-принципе шире, нежели в MPI.
- SHM намного дольше используется для программирования высокопроизводительных вычислений, и многие проблемные программисты либо изучили эту методику лучше, либо вообще изучили только ее одну.
Эти доводы нельзя было не привести здесь потому, что в реальной жизни их регулярно, и не без основания, приводят уже упомянутые проблемные программисты. Но в документе, посвященном MPI, им, конечно, будут противопоставлены определенные контрдоводы.
- в хорошо распараллеленном приложении на собственно взаимодействие между ветвями (пересылки данных и синхронизацию) тратится небольшая доля времени — несколько процентов от общего времени работы; таким образом, замедление пересылок, допустим, в два раза не означает общего падения производительности вдвое — она понизится на несколько процентов; подобное незначительное понижение производительности можно считать приемлемым,
- средства, имеющиеся в MPI (асинхронные/перманентные коммуникации) и особенно в MPI-2 (удаленный доступ к памяти) предоставляют скорость, сравнимую со скоростью SHM.
- все имеющиеся реализации SHM API либо в-принципе непереносимы за пределы SMP-машин, либо недостаточно эффективны, либо недостаточно распространены;
- стоимость вычислений и коммуникаций в SMP-машинах падает медленнее, чем в MPP-комплексах и сетях;
- методика обмена данными в виде сообщений обладает изначально большей наглядностью для программиста,
- в отличие от MPI, SHM API, как правило, реализует только самые базовые операции,
-
MPI сокращает разрыв в скорости выполнения программ, и увеличивает разрыв в скорости их написания.
- сложным: спецификация на MPI-1 содержит 300 страниц, на MPI-2 — еще 500 (причем это только отличия и добавления к MPI-1), и программисту для эффективной работы так или иначе придется с ними ознакомиться, помнить о наличии нескольких сотен функций, и о тонкостях их применения;
- специализированным: это система связи — и все.
- проведение декомпозиции,
- запись ее в терминах MPI.
Ветвь 1: Ветвь 2: MPI_Recv( . , 2, . ); MPI_Recv( . , 1, . ); MPI_Send( . , 2, . ); MPI_Send( . , 1, . ); | | Это номер ветви-отправителя/получателя
Примечание: здесь произойдет блокировка — ветви не смогут завершить прием, потому что не смогут начать передачу, потому что не смогут завершить прием. Как итог, программа повиснет.
Назовем некоторые перспективные типы такого инструментария, который лишал бы программиста необходимости вообще помнить о присутствии MPI.
Средства автоматической декомпозиции . Идеалом является такое оптимизирующее средство, которое на входе получает исходный текст некоего последовательного алгоритма, написанный на обычном языке программирования, и выдает на выходе исходный текст этого же алгоритма на этом же языке, но уже в распараллеленном на ветви виде, с вызовами MPI. Что ж, такие средства созданы (например, в состав полнофункционального пакета Forge входит, наряду с прочим, и такой препроцессор), но до сих пор, насколько мне известно, никто не торопится раздавать их бесплатно. Кроме того, вызывает сомнение их эффективность.
языки программирования . Это наиболее популярные на сегодняшний день средства полуавтоматической декомпозиции . В синтаксис универсального языка программирования (Си или Фортрана) вводятся дополнения для записи параллельных конструкций кода и данных. Препроцессор переводит текст в текст на стандартном языке с вызовами MPI. Примеры таких систем: mpC (massively parallel C) и HPF (High Performance Fortran).
Общим недостатком инструментов, производящих преобразование «текст в текст», является то, что синтаксическому разбору подвергаются оба текста: и исходный (его обрабатывает распараллеливающий препроцессор), и генерируемый (его обрабатывает компилятор). Это уменьшает скорость построения программы, и, кроме того, необходимость делать синтаксический разбор усложняет написание препроцессора. Поэтому, например, те фирмы-производители, которые поставляют свои ЭВМ вместе с Фортраном, встраивают HPF прямо в компилятор машинно-зависимого кода. Для расширений языка Си аналогичное решение может быть найдено в использовании GNU C.
Оптимизированные библиотеки для стандартных языков . В этом случае оптимизация вообще может быть скрыта от проблемного программиста. Чем больший объем работы внутри программы отводится подпрограммам такой библиотеки, тем бОльшим будет итоговый выигрыш в скорости ее (программы) работы. Собственно же программа пишется на обычном языке программирования безо всяких упоминаний об MPI, и строится стандартным компилятором. От программиста потребуется лишь указать для компоновки имя библиотечного файла MPI, и запускать полученный в итоге исполняемый не непосредственно, а через MPI-загрузчик. Популярные библиотеки обработки матриц, такие как Linpack, Lapack и ScaLapack, уже переписаны под MPI.
Средства визуального проектирования . Действительно, почему бы не расположить на экране несколько окон с исходным текстом ветвей, и пусть пользователь легким движением мыши протягивает стрелки от точек передачи к точкам приема — а визуальный построитель генерирует полный исходный текст? Тем, кто стряпал базы данных в Access’e, такая технология покажется наиболее естественной.
Отладчики и профайлеры . Об отладчиках мне пока нечего сказать, кроме того, что они нужны. Должна быть возможность одновременной трассировки/просмотра нескольких параллельно работающих ветвей — что-либо более конкретное мне пока сказать трудно.
- Моя страница, посвященная параллельным вычислениям, содержит дополнительные материалы по MPI, PVM, HPF etc.
- Информационный сервер по параллельным вычислениям НИВЦ МГУ
- Раздел MPI на сервере NetLib
Источник: www.opennet.ru
1. Интерфейс передачи сообщений, библиотека функций mpi. Основные понятия и определения.
MPI является библиотекой функций обмена данными между процессами, реализованной для языков С и Fortran. Головной организацией проекта MPI является Аргоннская национальная лаборатория США. После появления первой версии стандарта MPI в мае 1994 года MPI получил широкое распространение. В настоящее время стандарт MPI адаптирован для большинства суперЭВМ и кластеров.
Под параллельной программой в рамках MPI понимается множество одновременно выполняемых процессов, имеющих раздельные адресные пространства. Каждый процесс параллельной программы порождается на основе копии одного и того же программного кода (модель SPMP — одна программа множество процессов single program multiple processes). Программный код, представленный в виде исполняемой программы, должен быть доступен в момент запуска параллельной программы на всех используемых процессорах.
Количество процессов и число используемых процессоров определяется в момент запуска параллельной программы средствами среды исполнения MPI и в ходе вычислений меняться не может (в стандарте MPI-2 предусматривается возможность динамического изменения количества процессов). Все процессы программы последовательно нумеруются от 0 до p-1, где p есть общее количество процессов. Номер процесса называется рангом процесса.
Процессы параллельной программы объединяются в группы. Под коммуникатором в MPI понимается специально создаваемый служебный объект, объединяющий в своем составе группу процессов, используемых при выполнении операций передачи данных.
Коммуникаторы таким образом, ограничивают «пространственную» область коммуникации. Коммуникаторы разделяются на два вида: интра-коммуникаторы (внутригрупповые коммуникаторы), предназначенные для операций в пределах отдельной группы процессов, и интер-коммуникаторы (межгрупповые коммуникаторы), предназначенные для выполнения двух точечных обменов между процессами, входящими в две группы процессов.
Парные операции передачи данных выполняются для процессов, принадлежащих одному и тому же коммуникатору. Коллективные операции применяются одновременно для всех процессов коммуникатора.
В ходе вычислений могут создаваться новые и удаляться существующие группы процессов и коммуникаторы. Один и тот же процесс может принадлежать разным группам и коммуникаторам. Все имеющиеся в параллельной программе процессы входят в состав создаваемого по умолчанию коммуникатора с идентификатором MPI_COMM_WORLD.
MPI не предусматривает механизмов поведения при ошибках в коммуникационной системе и не обеспечивает никаких механизмов для обработки коммуникационных отказов. По умолчанию программная ошибка, обнаруженная во время исполнения MPI процедуры, вызывает окончание параллельных вычислений. Однако MPI предусматривает для пользователей механизм замены этого умолчания и обработки ошибок. Почти все функции MPI возвращают код, который указывает на успешное или не успешное завершение операции. Пользователь может самостоятельно проанализировать возвращаемый код MPI-ошибки и предусмотреть свою собственную обработку ошибочных ситуаций.
При выполнении операций передачи сообщений для указания передаваемых или получаемых данных в функциях MPI необходимо указывать тип пересылаемых данных. MPI содержит большой набор базовых типов данных, во многом совпадающих с типами данных в алгоритмических языках C и Fortran. Кроме того, в MPI имеются возможности для создания новых производных типов данных для более точного и краткого описания содержимого пересылаемых сообщений.
MPI содержит функции создания виртуальных топологий. Топология – это логическая организация процессов в группе (внутри коммуникатора).
Следует различать виртуальную и физическую топологию процессов. Виртуальная топология должна применяться к физическим процессам для организации логической структуры процессов с целью увеличения производительности обменов на данной вычислительной системе. Описание виртуальной топологии зависит от конкретного приложения и является машинно-независимой.
Наиболее общим видом топологии процессов является структура графа. Узлы графа соответствуют процессам, ребра соответствуют связям между процессами.
Наиболее часто в параллельных приложениях используется топология двумерных массивов или декартова топология. Эта структура полностью определяется количеством процессов по каждой координате (строки и столбцы). Координаты в декартовой топологии нумеруются от 0. Например, соотношение между номером процесса в группе и координатами в решетке [2, 2] для четырех процессов будет следующим:
coord (0,0): rank 0 сoord (0,1): rank 1
сoord (1,0): rank 2 сoord (1,1): rank 3
Коллективные операции передачи данных. Основные определения. Принцип взаимодействия процессов при выполнении барьерной синхронизации, широковещательной передачи, операций сборки и рассылки данных.
Под коллективными операциями в MPI понимаются операции над данными, в которых принимают участие все процессы в группе, определяемой одним коммуникатором. В противном случае, происходит ошибка, и выполнение параллельной программы прекращается. Коммуникатор обеспечивает контекст коллективных операций в группе.
Вызов коллективной функции на процессе возвращает управление сразу после того, как только его участие в коллективной операции завершено. Завершение вызова не означает, что другие процессы в группе завершили коллективную операцию, а только показывает, что процесс может обращаться к буферу обмена. Таким образом, вызов коллективной операции имеет эффект синхронизации всех процессов в группе. Это утверждение не относится к барьерной функции (MPI_Barrier), которая при вызове блокирует процесс до тех пор, пока все процессы в группе не вызовут ее, выполняя тем самым явную синхронизацию.
Используемые в коллективных операциях типы данных, должны совпадать у процесса-отправителя и процесса получателя. Условия соответствия типов для коллективных операций более строгие, чем аналогичные условия для парных обменов. А именно, для коллективных операций количество и тип посланных данных должно точно соответствовать количеству и типу принятых данных.
Коллективные операции могут иметь один процесс отправитель или получатель, или отправителями/получателями являются все процессы в группе. Различные коллективные операции (широковещание, рассылка или сбор данных) имеют единственный процесс-отправитель или процесс-получатель. Такой процесс называются корневым (root).
Некоторые аргументы в коллективных функциях определены как “существенные только для корневого процесса” и игнорируются для всех других участников операции.
Вызовы коллективных операций могут использовать те же коммуникаторы, что и парные обмены, при этом MPI гарантирует, что сообщения, созданные коллективными операциями, не будут смешаны с сообщениями, созданными парным обменом. Ключевым понятием в коллективных функциях является группа участвующих процессов, но в качестве явного аргумента выступает коммуникатор. Коммуникатор понимается как идентификатор группы, связанный с контекстом. Не разрешается использовать в качестве аргумента коллективной функции интер-коммуникатор (коммуникатор, для выполнения парных обменов между группами различных коммуникационных пространств).
1. Барьерная синхронизация MPI_Barrier (MPI_Comm comm)
В ряде ситуаций независимо выполняемые в процессах вычисления необходимо синхронизировать. Так, например, для измерения времени начала работы параллельной программы необходимо, чтобы для всех процессов одновременно были завершены все предварительные действия. Синхронизация процессов – это одновременное достижение процессами тех или иных точек процесса вычислений.
Функция барьерной синхронизации блокирует вызывающий процесс, пока все процессы группы не вызовут ее. В каждом процессе управление возвращается только тогда, когда все процессы в группе вызовут данную операцию.
2. Широковещательная передача MPI_BCAST
Функция посылает сообщение из одного процесса всем процессам группы, включая себя.
MPI_Bcast (buffer, count, datatype, root, comm )
IN/OUT buffer — адрес начала буфера
IN count — количество записей в буфере (целое)
IN datatype — тип данных в буфере
IN root — номер корневого процесса (целое)
IN comm — коммуникатор
Функция MPI_Bcast осуществляет рассылку данных из буфера buf, содержащего count элементов типа type с процесса, имеющего номер root, всем процессам, входящим в коммуникатор comm. Следует отметить, что:
1. Функция MPI_Bcast определяет коллективную операцию и, тем самым, при выполнении необходимых рассылок данных вызов функции MPI_Bcast должен быть осуществлен всеми процессами указываемого коммуникатора.
2. Указываемый в функции MPI_Bcast буфер памяти имеет различное назначение в разных процессах. Для root процесса, с которого осуществляется рассылка данных, в этом буфере должно находиться рассылаемое сообщение. Для всех остальных процессов указываемый буфер предназначен для приема передаваемых данных.
Коллективная операция рассылки данных от одного процесса всем (распределение данных) MPI_Scatter отличается от широковещательной рассылки тем, что корневой процесс передает всем процессам различные данные. Данные выбираются из массива равными порциями в порядке возрастания номеров процессов.
Источник: studfile.net
Введение в технологии параллельного программирования (MPI)
Аннотация: Лекция посвящена рассмотрению технологии MPI как стандарта параллельного программирования для систем с распределенной памятью. Рассматриваются основные режимы передачи данных. Вводятся такие понятия, как группы процессов и коммуникаторы. Рассматриваются основные типы данных, операции «точка-точка», коллективные операции, операции синхронизации и измерения времени.
Цель лекции: Лекция направлена на изучение общей методики разработки параллельных алгоритмов.
5.1. MPI: основные понятия и определения
Рассмотрим ряд понятий и определений, являющихся основополагающими для стандарта MPI .
5.1.1. Понятие параллельной программы
Под параллельной программой в рамках MPI понимается множество одновременно выполняемых процессов. Процессы могут выполняться на разных процессорах, но на одном процессоре могут располагаться и несколько процессов (в этом случае их исполнение осуществляется в режиме разделения времени). В предельном случае для выполнения параллельной программы может использоваться один процессор – как правило, такой способ применяется для начальной проверки правильности параллельной программы.
Каждый процесс параллельной программы порождается на основе копии одного и того же программного кода (модель SPMP). Данный программный код, представленный в виде исполняемой программы, должен быть доступен в момент запуска параллельной программы на всех используемых процессорах. Исходный программный код для исполняемой программы разрабатывается на алгоритмических языках C или Fortran с использованием той или иной реализации библиотеки MPI.
Количество процессов и число используемых процессоров определяется в момент запуска параллельной программы средствами среды исполнения MPI-программ и в ходе вычислений меняться не может (в стандарте MPI-2 предусматривается возможность динамического изменения количества процессов). Все процессы программы последовательно перенумерованы от 0 до p-1, где p есть общее количество процессов. Номер процесса именуется рангом процесса.
5.1.2. Операции передачи данных
Основу MPI составляют операции передачи сообщений. Среди предусмотренных в составе MPI функций различаются парные (point-to-point) операции между двумя процессами и коллективные (collective) коммуникационные действия для одновременного взаимодействия нескольких процессов.
Для выполнения парных операций могут использоваться разные режимы передачи, среди которых синхронный, блокирующий и др. – полное рассмотрение возможных режимов передачи будет выполнено в подразделе 5.3.
Как уже отмечалось ранее, стандарт MPI предусматривает необходимость реализации большинства основных коллективных операций передачи данных – см. подразделы 5.2 и 5.4.
5.1.3. Понятие коммуникаторов
Процессы параллельной программы объединяются в группы. Под коммуникатором в MPI понимается специально создаваемый служебный объект, объединяющий в своем составе группу процессов и ряд дополнительных параметров (контекст), используемых при выполнении операций передачи данных.
Как правило, парные операции передачи данных выполняются для процессов, принадлежащих одному и тому же коммуникатору. Коллективные операции применяются одновременно для всех процессов коммуникатора. Как результат, указание используемого коммуникатора является обязательным для операций передачи данных в MPI.
В ходе вычислений могут создаваться новые и удаляться существующие группы процессов и коммуникаторы. Один и тот же процесс может принадлежать разным группам и коммуникаторам. Все имеющиеся в параллельной программе процессы входят в состав создаваемого по умолчанию коммуникатора с идентификатором MPI_COMM_WORLD.
При необходимости передачи данных между процессами из разных групп необходимо создавать глобальный коммуникатор (intercommunicator).
Подробное рассмотрение возможностей MPI для работы с группами и коммуникаторами будет выполнено в подразделе 5.6.
5.1.4. Типы данных
При выполнении операций передачи сообщений для указания передаваемых или получаемых данных в функциях MPI необходимо указывать тип пересылаемых данных. MPI содержит большой набор базовых типов данных, во многом совпадающих с типами данных в алгоритмических языках C и Fortran. Кроме того, в MPI имеются возможности для создания новых производных типов данных для более точного и краткого описания содержимого пересылаемых сообщений.
Подробное рассмотрение возможностей MPI для работы с производными типами данных будет выполнено в подразделе 5.5.
5.1.5. Виртуальные топологии
Как уже отмечалось ранее, парные операции передачи данных могут быть выполнены между любыми процессами одного и того же коммуникатора, а в коллективной операции принимают участие все процессы коммуникатора. В этом плане, логическая топология линий связи между процессами имеет структуру полного графа (независимо от наличия реальных физических каналов связи между процессорами).
Вместе с этим (и это уже отмечалось в разделе 3), для изложения и последующего анализа ряда параллельных алгоритмов целесообразно логическое представление имеющейся коммуникационной сети в виде тех или иных топологий.
В MPI имеется возможность представления множества процессов в виде решетки произвольной размерности (см. подраздел 5.7). При этом, граничные процессы решеток могут быть объявлены соседними и, тем самым, на основе решеток могут быть определены структуры типа тор.
Кроме того, в MPI имеются средства и для формирования логических (виртуальных) топологий любого требуемого типа. Подробное рассмотрение возможностей MPI для работы с топологиями будет выполнено в подразделе 5.7.
И, наконец, последний ряд замечаний перед началом рассмотрения MPI:
- Описание функций и все приводимые примеры программ будут представлены на алгоритмическом языке C; особенности использования MPI для алгоритмического языка Fortran будут даны в п. 5.8.1,
- Краткая характеристика имеющихся реализаций библиотек MPI и общее описание среды выполнения MPI программ будут рассмотрены в п. 5.8.2,
- Основное изложение возможностей MPI будет ориентировано на стандарт версии 1.2 (MPI-1); дополнительные свойства стандарта версии 2.0 буду представлены в п. 5.8.3.
Приступая к изучению MPI, можно отметить, что, с одной стороны, MPI достаточно сложен – в стандарте MPI предусматривается наличие более 125 функций. С другой стороны, структура MPI является тщательно продуманной – разработка параллельных программ может быть начата уже после рассмотрения всего лишь 6 функций MPI. Все дополнительные возможности MPI могут осваиваться по мере роста сложности разрабатываемых алгоритмов и программ. Именное в таком стиле – от простого к сложному – и будет далее представлен весь учебный материал по MPI.
5.2. Введение в разработку параллельных программ с использованием MPI
5.2.1. Основы MPI
Приведем минимально-необходимый набор функций MPI, достаточный для разработки достаточно простых параллельных программ.
5.2.1.1 Инициализация и завершение MPI программ
Первой вызываемой функцией MPI должна быть функция:
int MPI_Init ( int *agrc, char ***argv );
для инициализации среды выполнения MPI-программы. Параметрами функции являются количество аргументов в командной строке и текст самой командной строки.
Последней вызываемой функцией MPI обязательно должна являться функция:
int MPI_Finalize (void);
Как результат, можно отметить, что структура параллельной программы, разработанная с использованием MPI, должна иметь следующий вид:
#include «mpi.h» int main ( int argc, char *argv[] ) < MPI_Init ( argv ); MPI_Finalize(); return 0; >
- Файл mpi.h содержит определения именованных констант, прототипов функций и типов данных библиотеки MPI,
- Функции MPI_Init и MPI_Finalize являются обязательными и должны быть выполнены (и только один раз) каждым процессом параллельной программы,
- Перед вызовом MPI_Init может быть использована функция MPI_Initialized для определения того, был ли ранее выполнен вызов MPI_Init.
Рассмотренные примеры функций дают представление синтаксиса именования функций в MPI. Имени функции предшествует префикс MPI, далее следует одно или несколько слов названия, первое слово в имени функции начинается с заглавного символа, слова разделяются знаком подчеркивания. Названия функций MPI, как правило, поясняют назначение выполняемых функцией действий.
5.2.1.2 Определение количества и ранга процессов
Определение количества процессов в выполняемой параллельной программе осуществляется при помощи функции:
int MPI_Comm_size ( MPI_Comm comm, int *size ).
Для определения ранга процесса используется функция:
int MPI_Comm_rank ( MPI_Comm comm, int *rank ).
Как правило, вызов функций MPI_Comm_size и MPI_Comm_rank выполняется сразу после MPI_Init:
#include «mpi.h» int main ( int argc, char *argv[] ) < int ProcNum, ProcRank; MPI_Init ( argv ); MPI_Comm_size ( MPI_COMM_WORLD, MPI_Comm_rank ( MPI_COMM_WORLD, MPI_Finalize(); return 0; >
- Коммуникатор MPI_COMM_WORLD, как отмечалось ранее, создается по умолчанию и представляет все процессы выполняемой параллельной программы,
- Ранг, получаемый при помощи функции MPI_Comm_rank, является рангом процесса, выполнившего вызов этой функции, т.е. переменная ProcRank будет принимать различные значения в разных процессах.
Источник: intuit.ru