Лекция Python_MPI.ppt
- Количество слайдов: 26
MPI for Python Подготовили: Игумин А. А. Поливода А. С.
За последние годы, высокопроизводительные вычисления стали доступным ресурсом для многих других исследователей в научном сообществе, чем когда-либо прежде. Соединение качественного программного обеспечения из открытого источника и удобных аппаратных средств, стали предпосылками к широкой популярности кластера класса Беовульф и кластера рабочей станции. Среди множества параллельных вычислительных моделей, передачи сообщений оказалась эффективной. Эта парадигма особенно хорошо подходит для архитектуры с распределенной памятью и используется на сегодняшний день в большинстве требовательных научных и технических приложениях, связанных с моделированием, имитацией, конструкцией и обработкой сигналов. Высокопроизводительные вычисления традиционно связаны с разработкой программного обеспечения и использования скомпилированного языка. Однако, в типичных прикладных программах, лишь небольшой части кода срочно может понадобиться эффективно скомпилированный язык. Остальная часть кода, как правило, связана с управлением памятью, обработкой ошибок, вводом/выводом и взаимодействием с пользователем, и эта часть, как правило, наиболее сильно подвержена ошибкам и состоит из трудоемких частей кода, которые надо писать и отлаживать во время всего процесса разработки. Интерпретируемые языки высокого уровня могут быть эффективны и выгодны для таких задач. Для Python был создан пакет, позволяющий приложениям использовать нескольким процессорам стандарт MPI в самих скриптах (сценариях) Python.
* OOMPI Некоторые пакеты из открытых источников Этот источник не имеет прямого отношения к Python, но это отличный объектноориентированный подход к реализации MPI Это C++ библиотеки спецификации классов, которые инкапсулируют в MPI функциональную иерархию классов. Это обеспечивает гибкий и интуитивно понятный интерфейс, добавляющий некоторые абстракции, такие как порты и сообщения, при этом упрощая и обогащая синтаксис. * py. MPI перестраивает интерпретатор Python предоставляя при этом встроенный модуль для передачи сообщений. Это позволяет осуществлять интерактивные параллельные запуски, которые полезны для анализа и отладки. Его интерфейс подходит для основных параллельных вычислений. Нет полной поддержки для определения новых коммуникаторов и топологии процесса. Общие объекты Python могут обмениваться сообщениями между процессорами. Нет поддержки числовых массивов. * Scientific Python Предоставляет набор модулей Python, которые полезны для научных вычислений. Осуществляется интерфейс MPI и BSP (массовая синхронная параллельная модель, состоит из процессоров, передающих другу сообщения через коммуникационную сеть) Интерфейс прост в использовании, но не закончен и не похож на специфический интерфейс MPI. Присутствует поддержка числовых массивов.
MPI для Python представляет собой объектноориентированный подход к передаче сообщений, который основан на стандартных MPI-2 C++ привязках. Интерфейс был разработан с упором на передачу синтаксиса MPI и семантики стандарта MPI-2 в C++ привязках для Python. Любой пользователь, который до этого пользовался стандартными С/С++ привязками, мог использовать эту модель без дополнительного изучения интерфейса.
В стандартной библиотеке Python поддерживаются различные механизмы для сохранения данных. В MPI для Python, Comm является базовым классом коммуникаторов. Intracomm и Intercomm классы sublcasses класса Comm. Is_inter () метод (и Is_intra (), для удобства, онне является частью спецификации MPI), определен для коммуникатора объектов и может быть использован для определения конкретных коммуникаторов класса. Два предопределенных случаев интракоммуникаторами доступны: COMM_SELF и COMM_WORLD. Из них, новые коммуникаторы могут быть созданы как нужные. Количество процессов в коммуникаторе и вызывающий процесс ранга может быть, соответственно, полученные с методами get_size () и Get_rank (). Соответствующей группы процесса может быть получена из коммуникатор вызове Get_group () метода, который возвращает экземпляр группы класса. Набор операций с группой объектов, таких как, как Union (), Intersect () и разницу () полностью поддерживаются, а также создание новых коммуникаторов от этих групп, используя Create (). Новые экземпляры коммуникатора может быть получен с Clone () метод объектов Comm, Dup () и Split () методы Intracomm и Intercomm объектов и способов Create_intercomm () и Merge () из Intracomm и Intercomm объектов, соответственно. Виртуальные топологии (Cartcomm, Graphcomm, и Distgraphcomm классов, являясь их специализации Intracomm класс) полностью поддерживаются. Новые экземпляры могут быть получены из интракоммуникаторами в случаях использование методов Create_cart () и Create_graph () класса Intracomm.
В контексте MPI-1 спецификации, параллельное приложение является статическим, то есть не процессы могут быть добавлены или удалены из запущенного приложения после его начала. К счастью, это ограничение было исправлено в MPI-2. В новой спецификации добавлены модели управления процессами обеспечения основного интерфейса между приложением и внешними ресурсами и процесс менеджеров. Это MPI-2 расширение может быть очень полезно, особенно для последовательных приложений, построенных на верхней части параллельных модулей, или параллельных приложений с помощью модели клиент / сервер. MPI-2 модели процессов предоставляет механизм для создания новых процессов и установки связи между ними и существующих приложений MPI. Она также обеспечивает механизмы для установления связи между двумя существующими MPI приложений, даже когда не начаты другие. В MPI для Python, новые независимые группы процессов могут быть созданы вызовом Spawn () методов в интеркоммуникаторах(то есть, например Intracomm). Этот вызов возвращает новый интеркоммуникатор (то есть, Intercomm например) на группу родительского процесса. Группа дочерний процесс может получить соответствующий интеркоммуникатор с помощью метода Get_parent () (класс), определенный в классе Comm.
На каждой стороне, интеркоммуникатор может быть использован для выполнения точка/точка и коллективной коммуникации между родителями и дочерней группой процессов. Кроме того, непересекающиеся группы процессов могут установить связь с использованием клиент-серверный подход. Любое серверное приложение должно сначала вызвать Open_port (), чтобы открыть порт и Publish_name () функцию, чтобы опубликовать предоставляемые услуги, и следующий вызов Accept () в экземпляре Intracomm. Любые клиентские приложения могут сначала найти опубликованные службы с помощью вызова Lookup_name (), которая возвращает порт, в котором сервер можно связаться, и следующий вызов Connect () метод в экземпляре Intracomm. Оба Accept () и Connect () методы возвращают экземпляр Intercomm. Когда связь между клиент / сервер процессами больше не нужна, все они должны совместно вызвать Disconnect () метод Class. Comm. Кроме того, сервер приложения должны освободить ресурсы путем вызова Unpublish_name () и Close_port () функции.
Односторонняя связь (также называется Remote Access Memory, RMA) дополняет традиционные двусторонние( отправлять / принимать на основе MPI модели общения с односторонними, PUT / GET интерфейса). Односторонние коммуникации, которые могут воспользоваться возможностями узкоспециализированного сетевого оборудования. Кроме того, это расширение снижает задержки программного обеспечения и накладных расходов в приложения, написанных с использованием разделяемой памяти типа парадигмы. Спецификация MPI основана на использовании объектов называемых окнами, они интуитивно определены в ячейках памяти процесса, которые были доступны для удаленных операций чтения и записи. Блоки могут быть доступны через три функции: отправить (удаленный Send), получить (удаленная запись), и сохранить (удаленный обновление или уменьшение) элементов данных. Гораздо большее число функций поддерживает различные функции синхронизации; Семантика этих операций синхронизации являются довольно сложной. В MPI для Python, односторонние операции доступны с помощью экземпляров Win класса. Новые объекты создаются путем вызова Create () методом для всех процессов внутри коммуникатора и указателя памяти буфера. Когда экземпляр больше не нужен, должен быть вызван метод Free (). Три односторонние операции MPI для удаленного запись, чтение и накапливание доступны через вызов метода Put (), Get (), и Accumulateт () соответственно в Win случаях. Эти методы должны иметь целый ранг, определение целевого процесса и целое смещение относительно базового адреса удаленного блока памяти, доступ к односторонней операции чтения, записи и редукции неявно неблокирующий, и должны быть синхронизированы при использовании в двух основных режимах. Активная синхронизация требует вызова процесса Start () и Complete() методов в начале процесса, а цель процесса сотрудничает Post () и Wait () методами. Существует также вариант для коллективного варианта Fence() метода. Пассивная синхронизация является более “снисходительной”, только начало процесса вызывает Lock () и Unlock () методы. Замки предназначены для защиты удаленного доступа, для блокировки удаленного окна и защиты локальной загрузки / сохранения, которые были заблокированы локальными окнами.
Обмен «Точка-точка» является одним из основных возможностей системы передачи сообщений. Этот механизм работает, как передача данных между парами процессов, одна сторона отправляет, другая получает. MPI предоставляет набор отправленных и полученных функций, позволяющих связывать данные с соответствующим тегом.
* В MPI для Python, Send(), Recv() и Sendrecv() обеспечивают поддержку Блокирования обмена точка-точка в пределах Intracomm и Intercomm экземпляров * В MPI для Python, Isend () и Irecv () методы класса Comm начать отправлять и получать операций без блокировки. Эти методы возвращают Request, для идентификации о начале работы. Завершением работы можно управлять с помощью Test(), Wait() и Cancel() методами запроса класса.
В MPI для Python, Send_init() и Recv_init() методы класса Comm, которые создают запрос для отправки и получения операции. Эти методы возвращают экземпляр класса Prequest. С помощью метода Start() начинается обмен данными и его завершением можно управлять описанными ранее методами.
MPI для Python обеспечивает поддержку почти всех коллективных обменов. Alltoallw () и Reduce_scatter () методы в Python не поддерживаются. В MPI для Python, Bcast(), Scatter(), Gather(), Allgather() и Alltoall() , Scatterv(), Gatherv(), Allgatherv() и Alltoallv() - методы поддерживаются. Bcast(), Scatter(), Gather(), Allgather() и Alltoall() могут взаимодействовать с объектами Python. Операции редукции доступны через Reduce(), Allreduce(), Scan() и Exscan() методы.
В MPI для Python, все MPI операций ввода / вывода осуществляются через экземпляр класса File; Метод Open() позволяет открывать файл и после использования операций вводавывода метод Close() вызывает закрытие файла. Файлы, также могут быть удалены путем вызова метода Delete(). Методы Set_view () и Get_view () – позволяют данным быть видимыми и доступными из отрытых файлов.
Initialization and Exit Модуль функции Init () или Init_thread () и Finalize () обеспечивают MPI инициализации и завершения соответственно. Внимание: MPI_Init () или MPI_Init_thread () – вызывается, когда вы импортируете модуль MPI из пакета mpi 4 py, если MPI еще не инициализирован.
*Номер версии MPI может быть получен из функционального модуля Get_version (). Get_processor_name () функция может быть использована для доступа к имени процессора. Значения атрибутов, привязанных к COMM_WORLD можно получить с помощью метода Get_attr(). *Функции MPI таймера доступны через Wtime() и Wtick() функции.
Функции обработки ошибок почти полностью поддерживается Питоном. Ошибки, возникающие при вызове MPI, вызывают экземпляр класса Exception, который является подклассом стандартных исключений Python Runtime. Error. Внимание: При импорте from mpi 4 py. MPI import приведет к конфликту со стандартным базовым классом Exception в Python. В целях активизации коммуникатора обмена с другими модулями, Python взаимодействует с MPI на основе параллельных библиотек Обработчики ошибок ERRORS_RETURN, ERRORS_ARE_FATAL Методы класса {Class}. Set_errhandler() and{Class}. Get_errhandler().
Этот пакет предоставляет Питону привязки для стандарта Message Passing Interface (MPI). Это осуществлено на основе MPI-1/MPI-2 спецификации и предоставляет API, который основан на стандарте MPI-2 C ++ привязок. Этот пакет поддерживает: Удобную коммуникацию любого объекта Питона: двухточечный (передача/прием), коллективный (передача, разбиение и сбор, восстановление), Быстрая коммуникация объекта Питона, подвергающая буферизации интерфейса Питона, (множества Num. Py, встроенные объекты байтов/последовательности/множества) двухточечный (Блокирующий/неблокирующий, передача/прием), коллективный (передача, блок/вектор, рассеивание/сборка, восстановление), Группы процессов и коммуникационные области Создание новых внутренних/внешних коммуникаторов Декартовы графы & топология графа Параллельный вход/выход: Чтение/запись Блокирующий/неблокирующий & коллективный/неколлективный отдельные/общие указатели файла & явное смещение Управление динамическим процессом порождение & многократное порождение прием/соединение публикация имени & поиск Односторонние операции (PUT, GET, накапливать)
Если у вас есть доступ администратора (либо войдите в систему в качестве администратора при помощи смены учетных записей), и вы хотите установить MPI для Python в вашей системе для всех пользователей, надо сделать следующее: $ python setup. py install В предыдущем шаге пакет mpi 4 py устанавливается в стандартную папку по умолчанию: prefix/lib/python. X. X/site-packages. Если у вас нет привилегий или вы хотите установить MPI для Python для одного (либо для групп) пользователя, у вас есть два варианта в зависимости от целевой версии Python. • Для Python 2. 6 и выше: $ python setup. py install --user • Для Python 2. 5 и ниже (при условии, что ваши корневые директории доступны через переменную окружения HOME): $ python setup. py install --home=$HOME Наконец, добавьте $HOME/lib/python или $HOME/lib 64/python для вашей среды переменных переменную PYTHONPATH.
Выдача в командной строке: $ mpiexec -n 5 python demo/helloworld. py или (в случае старших MPI-1 реализаций): $ mpirun -np 5 python demo/helloworld. py интерпретатор запустит пять процессов Python и запустить тестовый скрипт demo/helloworld. py. Вы также можете запустить все модульные тесты сценариев: $ mpiexec -n 5 python test/runalltest. py или, если у вас установлена основная тестирующая структура фремворка: $ mpiexec -n 5 nosetests -w test
* SWIG (англ. Simplified Wrapper and Interface Generator) — свободный инструмент для связывания (англ. ) программ и библиотек написанных на C/C++ со скриптовыми языками, такими как Tcl, Perl, Python, Ruby, PHP или другими языками наподобие Java, C#, Scheme или OCaml. Основная цель — достигнуть связи с минимальными усилиями: в файлы заголовка программы добавляется небольшое количество указаний, по которым SWIG генерирует исходный код для склеивания C/C++ и нужного языка.


