Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

English

ЮФУ

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет), 1998–2022

 

PT for MPI-2 | Выполнение заданий в параллельном режиме   | Запуск программы

PrevNext


Запуск программы в параллельном режиме

Теперь выясним, каким образом данный проект можно запустить в параллельном режиме. При компиляции и запуске из интегрированной среды любой программы (даже с подключенной библиотекой MPI) она будет запущена в единственном экземпляре. В единственном экземпляре она будет запущена и в случае, если мы выйдем из интегрированной среды и запустим на выполнение откомпилированный exe-файл данной программы.

Для запуска программы в параллельном режиме необходима «управляющая» программа (англ. host application), которая, во-первых, обеспечивает запуск нужного количества экземпляров исходной программы и, во-вторых, перехватывает сообщения, отправленные этими экземплярами (процессами) и пересылает их по назначению.

Мы уже отмечали, что экземпляры «настоящих» параллельных программ обычно запускаются на разных компьютерах, объединенных в сеть (вычислительный кластер), или на суперкомпьютерах, снабженных большим числом процессоров. Именно в ситуации, когда каждый процесс выполняется на своем собственном процессоре, и обеспечивается максимальная эффективность параллельных программ. Разумеется, для проверки правильности наших учебных программ все их экземпляры достаточно запускать на одном локальном компьютере. Однако управляющая программа необходима и в этом случае.

В качестве управляющей программы для параллельных программ задачник PT for MPI использует приложение, входящее в систему MPICH. В версии MPICH 1.2.5 оно имеет имя MPIRun.exe (и содержится в каталоге MPICH\mpd\bin), в версии MPICH2 1.3 — имя mpiexec.exe (и содержится в каталоге MPICH2\bin). Для запуска исполняемого файла в параллельном режиме достаточно запустить соответствующую управляющую программу (MPIRun.exe или mpiexec.exe), передав ей полное имя файла, требуемое количество процессов (т. е. запущенных экземпляров программы) и некоторые дополнительные параметры. Поскольку при тестировании программы такие запуски придется осуществлять многократно, желательно создать пакетный файл (bat-файл), содержащий вызов управляющей программы со всеми необходимыми параметрами. Однако и в этом случае процесс тестирования параллельной программы будет не слишком удобным: каждый раз после внесения необходимых исправлений в программу ее придется перекомпилировать, после чего, покинув интегрированную среду, запускать bat-файл. Проанализировав результаты работы программы, потребуется опять вернуться в интегрированную среду для внесения в нее очередных изменений, и т. д.

Примечание 1. В среде Microsoft Visual Studio предусмотрен механизм, упрощающий тестирование программ, для запуска которых требуется управляющая программа. В настройках проекта (команда меню «Project | <имя проекта> Properties…») в разделе «Debugging» можно указать эту управляющую программу (поле «Command»; в нашем случае это будет MPIRun.exe или mpiexec.exe) и параметры ее запуска (поле «Command Arguments»; требуемые в нашем случае параметры описываются далее в этом пункте). После задания подобных настроек запуск разрабатываемого приложения будет приводить к запуску управляющей программы. Таким образом, необходимость в отдельном запуске bat-файла отпадает. Правда, при этом потребуется добавить в программу фрагмент, обеспечивающий ее приостановку в конце выполнения, поскольку при его отсутствии окно управляющей программы будет немедленно закрыто, и не удастся ознакомиться с полученными результатами. Следует также отметить, что в большинстве сред разработки (в частности, в Code::Blocks) управляющую программу можно указывать только при тестировании библиотек, поэтому при использовании подобных сред обойтись без вспомогательных bat-файлов для запуска тестируемой программы не удастся.

Для того чтобы действия по запуску параллельной программы не отвлекали от решения задачи, задачник PT for MPI-2 выполняет их самостоятельно. Продемонстрируем это на примере нашего проекта для решения задачи MPI1Proc2, который уже готов к запуску. Нажмите клавишу F5 в среде Visual Studio; в результате будет выполнена компиляция программы и, в случае ее успешного завершения, программа будет запущена на выполнение. Поскольку мы не вносили в заготовку никаких изменений, компиляция должна завершиться успешно. При запуске программы на экране появится консольное окно, подобное приведенному на следующем рисунке:

После нескольких строк информационного сообщения в этом окне отображается командная строка, которая обеспечивает запуск программы ptprj.exe в параллельном режиме под управлением mpiexec.exe. Число «5», указанное перед полным именем exe-файла, означает, что соответствующий процесс будет запущен в пяти экземплярах. Параметр –nopopup_debug отключает вывод сообщений об ошибках в отдельном окне (поскольку эти сообщения в конечном итоге будут выведены в окне задачника), параметр – localonly обеспечивает запуск всех экземпляров процесса на локальном компьютере.

Сразу после появления консольного окна, если ранее параллельная программа с именем ptprj.exe не запускалась, на экране может появиться еще одно окно:

В этом окне следует выбрать вариант «Разрешить доступ».

Наконец, на экране появится окно задачника:

Внешне это окно ничем не отличается от окна, возникающего при выполнении обычной, «непараллельной» программы. Однако отличие имеется: в данном случае информация о том, что не была выполнена ни одна из операций ввода-вывода, относится ко всем процессам, запущенным в параллельном режиме.

Для завершения работы программы надо, как обычно, закрыть окно задачника (например, щелкнув мышью на кнопке «Выход (Esc)» или нажав клавишу Esc). После закрытия окна задачника немедленно закроется и консольное окно, и мы вернемся в интегрированную среду, из которой была запущена наша программа.

Таким образом, откомпилировав и запустив программу из интегрированной среды, мы смогли сразу обеспечить ее выполнение в параллельном режиме. Это происходит благодаря достаточно сложному механизму, который реализован в ядре задачника Programming Taskbook. Для того чтобы успешно выполнять учебные задания, не требуется детального понимания этого механизма, поэтому дадим здесь лишь его краткое описание (подробности приведены в разделе «Особенности работы задачника в параллельном режиме»).

«На самом деле» программа, запущенная из интегрированной среды, не пытается решить задачу и выполняется в обычном, «непараллельном» режиме. Обнаружив, что задача относится к группе заданий по параллельному программированию, она лишь создает пакетный файл $pt_run$.bat, записывая в него строки комментария и командную строку, обеспечивающую вызов программы mpiexec.exe с необходимыми параметрами, после чего запускает этот пакетный файл на выполнение и переходит в режим ожидания завершения работы пакетного файла. Запущенная с помощью пакетного файла программа mpiexec.exe запускает, в свою очередь, нужное количество экземпляров программы (процессов) в параллельном режиме, и эти процессы действительно пытаются решить задачу. В частности, задачник предлагает каждому процессу его набор исходных данных и ожидает от него набор результатов.

Поскольку в нашем случае ни в одном процессе не была указана ни одна операция ввода-вывода, данный запуск параллельной программы был признан ознакомительным, о чем и было сообщено в информационном разделе окна задачника. Отметим, что данное окно отображается главным процессом параллельной программы, в то время как все подчиненные процессы (а также самый первый экземпляр программы, обеспечивший создание и запуск пакетного файла) работают в «невидимом» режиме.

При закрытии окна задачника происходит завершение всех процессов параллельной программы, после этого завершается выполнение пакетного файла и, наконец, обнаружив, что пакетный файл успешно завершил работу, завершает работу и тот экземпляр нашей программы, который был запущен из интегрированной среды.

Примечание 2. «Стартовый» экземпляр программы обеспечивает выполнение еще одного действия: он автоматически выгружает из памяти все процессы параллельной программы, если в результате неправильного программирования происходит их «зависание». Если при выполнении параллельной программы в течение 20–30 секунд окно задачника не появляется, то это, как правило, означает, что она зависла (иногда зависание программы проявляется в том, что после закрытия окна задачника не происходит немедленного закрытия консольного окна, т. е. завершения работы пакетного файла). В этой ситуации надо закрыть консольное окно, следуя приведенным в нем указаниям — нажав несколько раз комбинацию клавиш Ctrl+C или Ctrl+Break. Если стартовый экземпляр программы обнаружит, что пакетный файл завершил свою работу, а в памяти остались зависшие процессы параллельной программы, то он автоматически выгрузит из памяти все эти процессы. Это действие является важным, так как, пока в памяти остаются процессы, связанные с исполняемым файлом, этот файл нельзя изменить (в частности, удалить или заменить на новый откомпилированный вариант).

Примечание 3. Иногда зависают лишь некоторые подчиненные процессы параллельного приложения. В этом случае главный процесс обычно выводит свое окно и сообщает, в каких именно подчиненных процессах произошло зависание (а также выводит результаты, полученные из тех подчиненных процессов, которые не зависли). Такая информация может оказаться полезной при поиске и исправлении ошибок.

Главный процесс считает подчиненный процесс зависшим, если он не получает от него отклика в течение некоторого промежутка времени (пропорционального количеству процессов). По умолчанию это промежуток равен 3*K секунд, где K — количество процессов (об этом сообщается в комментарии, который выводится в консольном окне). В некоторых, очень редких, случаях при выполнении заданий на компьютерах с низким быстродействием возможна ситуация, когда некоторые подчиненные процессы «не успеют» завершить свою часть работы за отведенное время ожидания, и главный процесс сочтет их зависшими, хотя решение задачи является правильным. В таких случаях можно увеличить время ожидания, используя команды контекстного меню окна задачника «Увеличить время ожидания отклика от подчиненных процессов» и «Уменьшить время ожидания отклика от подчиненных процессов».


PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
01.01.2022