ОБЩАЯ ОРГАНИЗАЦИЯ MPI
Медитируйте на великие мантры: Ишавасьям идам сарвам, йят кинча джагатъям джагат. - Эта Вселенная пронизана Господом. Сарвам кхалвидам брахма, на иха напасти кинчана - Все это воистину Брахман, многообразия не существует. Йят-ча кинчит джагат сарвам дришьяте шруйяте апи ва антар бахишча тат сарвам въяпья нарайянах стхитах - Все, что можно видеть и слышать в этой Вселенной, все наполнено Господом Нарайяной, внутри и вовне. Виштабхьядам идам критснам экамсена стхито джагат - Бесконечно малой частицей Себя Я наполню эту Вселенную. Йо мам пашьяти сарватра, сарвам ча майи пашъяти - (Мудрый человек) видит Меня всюду и все существа во Мне. Эти формулы напоминают вам, что в каждом атоме Вселенной пребывает высшая Сущность. Постоянно удерживая эту возвышенную мысль, вы сможете осознать бесконечный абсолютный Брахман. Простое сочувствие этой истине не поможет. Вы должны быть практичными. Вы должны действительно расширять сердце и пытаться ощутить, что все видимое и слышимое вами есть Бог и только Бог. Вы должны спрашивать себя на каждом шагу: "Проявляю ли я эту истину своей мыслью, словом и делом?" Если вы действительно осознаете это, то уже никогда не навредите ни одному существу, не произнесете грубого или вульгарного слова, никогда не подумаете плохо о других и всегда будете заняты служением всем, сознавая собственный Дух. Только такое бескорыстное служение человечеству и космическая любовь приведет вас к вершинам вишватма-йоги (йоги всех душ, йога единства). www.e-puzzle.ru
ОБЩАЯ ОРГАНИЗАЦИЯ MPI MPI-программа представляет собой набор независимых процессов, каждый из которых выполняет свою собственную программу (не обязательно одну и ту же), написанную на языке C или FORTRAN. Появились реализации MPI для C++, однако разработчики стандарта MPI за них ответственности не несут. Процессы MPI-программы взаимодействуют друг с другом посредством вызова коммуникационных процедур. Как правило, каждый процесс выполняется в своем собственном адресном пространстве, однако допускается и режим разделения памяти. MPI не специфицирует модель выполнения процесса - это может быть как последовательный процесс, так и многопотоковый. MPI не предоставляет никаких средств для распределения процессов по вычислительным узлам и для запуска их на исполнение. Эти функции возлагаются либо на операционную систему, либо на программиста. В частности, на nCUBE2 используется стандартная команда xnc, а на кластерах - специальный командный файл (скрипт) mpirun, который предполагает, что исполнимые модули уже каким-то образом распределены по компьютерам кластера. Описываемый в данном методическом пособии стандарт MPI 1.1 не содержит механизмов динамического создания и уничтожения процессов во время выполнения программы. MPI не накладывает каких-либо ограничений на то, как процессы будут распределены по процессорам, в частности, возможен запуск MPI программы с несколькими процессами на обычной однопроцессорной системе. Для идентификации наборов процессов вводится понятие группы, объединяющей все или какую-то часть процессов. Каждая группа образует область связи, с которой связывается специальный объект - коммуникатор области связи. Процессы внутри группы нумеруются целым числом в диапазоне 0..groupsize-1. Все коммуникационные операции с некоторым коммуникатором будут выполняться только внутри области связи, описываемой этим коммуникатором. При инициализации MPI создается предопределенная область связи, содержащая все процессы MPI-программы, с которой связывается предопределенный коммуникатор MPI_COMM_WORLD. В большинстве случаев на каждом процессоре запускается один отдельный процесс, и тогда термины процесс и процессор становятся синонимами, а величина groupsize становится равной NPROCS - числу процессоров, выделенных задаче. В дальнейшем обсуждении мы будем понимать именно такую ситуацию и не будем очень уж строго следить за терминологией. Итак, если сформулировать коротко, MPI - это библиотека функций, обеспечивающая взаимодействие параллельных процессов с помощью механизма передачи сообщений. Это достаточно объемная и сложная библиотека, состоящая примерно из 130 функций, в число которых входят:
Набор функций библиотеки MPI далеко выходит за рамки набора функций, минимально необходимого для поддержки механизма передачи сообщений [1]. Однако сложность этой библиотеки не должна пугать пользователей, поскольку, в конечном итоге, все это множество функций предназначено для облегчения разработки эффективных параллельных программ. В конце концов, пользователю принадлежит право самому решать, какие средства из предоставляемого арсенала использовать, а какие нет. В принципе, любая параллельная программа может быть написана с использованием всего 6 MPI функций, а достаточно полную и удобную среду программирования составляет набор из 24 функций[5]. Каждая из MPI функций характеризуется способом выполнения: 1. Локальная функция - выполняется внутри вызывающего процесса. Ее завершение не требует коммуникаций. 2. Нелокальная функция - для ее завершения требуется выполнение MPI процедуры другим процессом. 3. Глобальная функция - процедуру должны выполнять все процессы группы. Несоблюдение этого условия может приводить к зависанию задачи. 4. Блокирующая функция - возврат управления из процедуры гарантирует возможность повторного использования параметров, участвующих в вызове. Никаких изменений в состоянии процесса, вызвавшего блокирующий запрос, до выхода из процедуры не может происходить. 5. Неблокирующая функция - возврат из процедуры происходит немедленно, без ожидания окончания операции и до того, как будет разрешено повторное использование параметров, участвующих в запросе. Завершение неблокирующих операций осуществляется специальными функциями. Использование библиотеки MPI имеет некоторые отличия в языках C и FORTRAN. В языке C все процедуры являются функциями, и большинство из них возвращает код ошибки. При использовании имен подпрограмм и именованных констант необходимо строго соблюдать регистр символов. Массивы индексируются с 0. Логические переменные представляются типом int (true соответствует 1, а false - 0). Определение всех именованных констант, прототипов функций и определение типов выполняется подключением файла mpi.h. Введение собственных типов в MPI было продиктовано тем обстоятельством, что стандартные типы языков на разных платформах имеют различное представление. MPI допускает возможность запуска процессов параллельной программы на компьютерах различных платформ, обеспечивая при этом автоматическое преобразование данных при пересылках. В таблице 1 приведено соответствие предопределенных в MPI типов стандартным типам языка С. Таблица 1. Соответствие между MPI-типами и типами языка C
В языке FORTRAN большинство MPI процедур являются подпрограммами (вызываются с помощью оператора CALL), а код ошибки возвращают через дополнительный последний параметр процедуры. Несколько процедур, оформленных в виде функций, код ошибки не возвращают. Не требуется строгого соблюдения регистра символов в именах подпрограмм и именованных констант. Массивы индексируются с 1. Объекты MPI, которые в языке C являются структурами, в языке FORTRAN представляются массивами целого типа. Определение всех именованных констант и определение типов выполняется подключением файла mpif.h. В таблице 2 приведено соответствие предопределенных в MPI типов стандартным типам языка FORTRAN. Таблица 2. Соответствие между MPI-типами и типами языка FORTRAN
В таблицах 1 и 2 перечислен обязательный минимум поддерживаемых стандартных типов, однако, если в базовой системе представлены и другие типы, то их поддержку будет осуществлять и MPI, например, если в системе есть поддержка комплексных переменных двойной точности DOUBLE COMPLEX, то будет присутствовать тип MPI_DOUBLE_COMPLEX. Типы MPI_BYTE и MPI_PACKED используется для передачи двоичной информации без какого-либо преобразования. Кроме того, программисту предоставляются средства создания собственных типов на базе стандартных (раздел 5.1). Изучение MPI начнем с рассмотрения базового набора из 6 функций, образующих минимально полный набор, достаточный для написания простейших программ. При обсуждении параметров процедур символами IN будем указывать входные параметры процедур, символами OUT выходные, а INOUT - входные параметры, модифицируемые процедурой.
|