|
Запуск программы в параллельном режиме
Теперь выясним, каким образом данный проект можно запустить в
параллельном режиме. При компиляции и запуске из интегрированной
среды любой программы (даже с подключенной библиотекой 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-файл. Проанализировав результаты
работы программы, потребуется опять вернуться в интегрированную среду
для внесения в нее очередных изменений, и т. д.
Для того чтобы действия по запуску параллельной программы не
отвлекали от решения задачи, задачник 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 запускает,
в свою очередь, нужное количество экземпляров программы (процессов) в
параллельном режиме, и эти процессы действительно пытаются решить
задачу. В частности, задачник предлагает каждому процессу его набор
исходных данных и ожидает от него набор результатов.
Поскольку в нашем случае ни в одном процессе не была указана ни
одна операция ввода-вывода, данный запуск параллельной программы был
признан ознакомительным, о чем и было сообщено в информационном
разделе окна задачника. Отметим, что данное окно отображается главным
процессом параллельной программы, в то время как все подчиненные
процессы (а также самый первый экземпляр программы, обеспечивший
создание и запуск пакетного файла) работают в «невидимом» режиме.
При закрытии окна задачника происходит завершение всех процессов
параллельной программы, после этого завершается выполнение пакетного
файла и, наконец, обнаружив, что пакетный файл успешно завершил
работу, завершает работу и тот экземпляр нашей программы, который был
запущен из интегрированной среды.
|