|
Запуск программы в параллельном режиме
Теперь выясним, каким образом данный проект можно
запустить в параллельном режиме. В самом деле, при компиляции и
запуске обычной программы из интегрированной среды она будет
запущена в единственном экземпляре. В единственном экземпляре она
будет запущена и в случае, если мы выйдем из интегрированной среды и
запустим на выполнение откомпилированный exe-файл данной
программы.
Для запуска программы в параллельном режиме необходима
«управляющая» программа, которая, во-первых, обеспечивает
запуск нужного количества экземпляров исходной программы и, во-вторых,
перехватывает сообщения, отправленные этими экземплярами
(процессами) и пересылает их по назначению.
Следует заметить, что экземпляры «настоящих»
параллельных программ обычно запускаются на разных
компьютерах, объединенных в сеть (кластер), или на суперкомпьютерах,
снабженных большим числом процессоров. Именно в ситуации, когда
каждый процесс выполняется на своем собственном процессоре, и
обеспечивается максимальная эффективность параллельных программ.
Разумеется, для проверки правильности наших учебных программ все их
экземпляры достаточно запускать на одном локальном компьютере.
Однако управляющая программа необходима и в этом случае.
В качестве управляющей программы для параллельных программ
задачник PT for MPI использует приложение MPIRun.exe, входящее в
систему MPICH. Для запуска исполняемого файла в параллельном режиме
достаточно запустить программу MPIRun.exe, передав ей полное имя
файла, требуемое количество процессов (т. е. запущенных экземпляров
программы) и некоторые дополнительные параметры. Поскольку при
тестировании программы такие запуски придется осуществлять
многократно, удобно создать пакетный файл (bat-файл), содержащий
вызов MPIRun.exe со всеми необходимыми параметрами. Однако и в этом
случае процесс тестирования параллельной программы будет не слишком
удобным: каждый раз после внесения необходимых исправлений в
программу ее придется перекомпилировать, после чего, покинув
интегрированную среду, запускать bat-файл. Проанализировав результаты
работы программы, потребуется опять вернуться в интегрированную среду
для внесения в нее очередных изменений, и т. д.
Для того чтобы действия по запуску параллельной программы не
отвлекали от решения задачи, задачник PT for MPI выполняет эти действия
самостоятельно.
Напомним, что в настоящее время мы имеем проект-заготовку для
выполнения задания MPIBegin1, который уже готов к запуску. Нажмем
клавишу [F9] (в среде Lazarus, Delphi или Code::Blocks) или [F5] (в среде Visual Studio); в
результате будет выполнена компиляция программы и, в случае ее
успешного завершения, программа будет запущена на выполнение.
Поскольку мы не вносили в заготовку никаких изменений, компиляция
должна завершиться успешно. При запуске программы на экране появится
консольное окно, подобное следующему:
После трех строк информационного сообщения в этом окне
отображается командная строка, которая обеспечивает запуск программы
MPIBegin1.exe (или ptprg.exe в случае использования языка C++) в
параллельном режиме под управлением MPIRun.exe. Число
«3», указанное перед полным именем exe-файла, означает, что
соответствующий процесс будет запущен в трех экземплярах. Параметр
nopopup_debug отключает вывод сообщений об ошибках в
отдельном окне (поскольку эти сообщения в конечном итоге будут
выведены в окне задачника), параметр localonly обеспечивает
запуск всех экземпляров процесса на локальном компьютере.
Сразу после появления консольного окна, если ранее параллельная
программа с именем MPIBegin1.exe (или ptprg.exe) не запускалась, на
экране может появиться еще одно окно:
Поскольку мы не собираемся связываться с другими компьютерами, в
данном окне можно выбрать любой вариант: как
«Блокировать», так и «Разблокировать». На
выполнение локальных экземпляров программы это не окажет никакого
влияния.
Наконец, на экране появится окно задачника:
Внешне это окно ничем не отличается от окна, возникающего при
выполнении обычной, «непараллельной» программы. Однако
отличие имеется: в данном случае информация о
том, что не была выполнена ни одна из операций ввода-вывода, относится
ко всем процессам, запущенным в параллельном режиме.
Для завершения работы программы надо, как обычно, закрыть окно
задачника (например, щелкнув мышью на кнопке «Выход
(Esc)» или нажав клавишу [Esc]; кроме того, при использовании среды Lazarus/Delphi/Code::Blocks можно нажать
[F9], а при использовании среды Visual Studio [F5]). После закрытия окна задачника
немедленно закроется и консольное окно, и мы вернемся в
интегрированную среду, из которой была запущена наша программа.
Таким образом, откомпилировав и запустив программу из
интегрированной среды, мы смогли сразу обеспечить ее выполнение в
параллельном режиме. Это происходит благодаря достаточно сложному
механизму, который реализован в ядре задачника Programming Taskbook.
Для того чтобы успешно выполнять учебные задания, не требуется
детального понимания этого механизма, поэтому дадим здесь лишь его
краткое описание (подробности приведены в разделе
«Особенности работы задачника в параллельном режиме»).
На самом деле программа, запущенная из интегрированной среды, не
пытается решить задачу и выполняется в обычном,
«непараллельном» режиме. Обнаружив, что задача
относится к группе заданий по параллельному программированию, она
лишь создает пакетный файл $pt_run$.bat, записывая в него три строки
комментария и командную строку, обеспечивающую вызов программы
MPIRun.exe с необходимыми параметрами, после чего запускает этот
пакетный файл на выполнение и переходит в режим ожидания завершения
работы пакетного файла. Запущенная с помощью пакетного файла
программа MPIRun.exe запускает, в свою очередь, нужное количество
экземпляров программы (процессов) в параллельном режиме, и эти
процессы действительно пытаются решить задачу. В частности, задачник
предлагает каждому процессу его набор исходных данных и ожидает от
него набор результатов.
Поскольку в нашем случае ни в одном процессе не была указана ни
одна операция ввода-вывода, данный запуск параллельной программы
был признан ознакомительным, о чем и было сообщено в информационном разделе
окна задачника. Отметим, что данное окно отображается главным
процессом параллельной программы, в то время как все подчиненные
процессы (а также самый первый экземпляр программы, обеспечивший
создание и запуск пакетного файла) работают в «невидимом»
режиме.
При закрытии окна задачника происходит завершение всех процессов
параллельной программы, после этого завершается выполнение пакетного
файла, и наконец, обнаружив, что пакетный файл успешно завершил
работу, завершает работу и тот экземпляр нашей программы, который был
запущен из интегрированной среды.
|