Использование MPI
|
Памятка пользователя
[ Автор: Илья Евсеев ]
[ Организация: ИВВиБД ]
[ Подразделение: ЦСТ ]
Здесь перечислены правила, в той или иной степени применимые к большинству реализаций MPI. Некоторые замечания относятся к особенностям Юникса, о которых не мешает помнить всегда, а работая с MPI - в особенности.
Утилиты построения и запуска MPI-приложений
Эти утилиты находятся в подкаталоге bin каталога MPI. Для их быстрого запуска наберите в командной строке или укажите в стартовом файле следующую команду:
C-Shell (файл .cshrc): setenv PATH путь_к_MPI/bin:$PATH bash (файл .bashrc): export PATH=путь_к_MPI/bin:$PATH DOS/Win (C:\AUTOEXEC.BAT): set PATH=путь_к_MPI\bin;%PATH%
Командные файлы с именами mpicc, mpiCC, mpif77 и т.д. предназначены для компиляции и компоновки соответствующих исходных текстов. Примеры:
mpicc mpi_ex0.c -o mpi_ex0 mpiCC mpi_ex1.cc -o mpi_ex1 mpif77 mpi_ex2.f -o mpi_ex2 -g -lmПри этом будет вызван обычный компилятор Си/Си++/Фортрана с указанной командной строкой, дополненной директивами подключения заголовочных и библиотечных файлов MPI.
Дополнительные ключи, не передаваемые компилятору, а обрабатываемые самим командным файлом, в спецификации не оговорены, но возможны. Например, в MPICH ключ -echo включает трассировку выполнения командного файла, полезную для поиска ошибок в инсталляции сопутствующего мат.обеспечения. У большинства утилит для вывода подсказки служит ключ -help.
Загрузчик MPI-приложений называется mpirun. У него ключей много разных и всяких, но только один из них является обязательным (-np = number of processes):
mpirun -np N [mpirun_args] program_file [command_line_args ...]Параллельное приложение будет образовано N задачами-копиями, загруженными из программного файла program_file. В момент запуска все задачи одинаковы (и имеют одинаковые параметры командной строки), но получают от MPI разные номера от 0 до N-1. Пример:
mpirun -np 5 ./mpi_ex0
Примечание: текущий каталог "./" указывается здесь явно, потому что без явного указания либо в имени программы, либо в переменной окружения PATH Юникс НЕ станет искать в нем приложение. Если по умолчанию PATH не содержит ".", Вы можете сами исправить .cshrc или .bashrc в своем домашнем каталоге:
C-Shell: set path = ( . $path ) bash: export PATH=.:$PATH
Практика показывает, что на период работы с той или иной библиотекой полезно бывает распечатать и держать под рукой ее заголовочные файлы из подкаталога include. В Convex MPI такой файл один: mpi.h, в MPICH их три: mpi.h (описания констант и типов), mpi_errno.h (коды ошибок и их описания) и binding.h (прототипы функций). В случае для Windows печатать рекомендуется не оригиналы, а копии, из которых вычищены все детали, относящиеся к реализации ("_declspec(dllimport)" и проч.).
Manual pages - хорошее подспорье, когда они есть. Независимо от этого, документация из разных версий MPICH доступна для Вас двумя способами:
Более детальную информацию, как-то: спецификацию, учебники и различные реализации MPI можно найти на сервере NetLib. Первоисточником для данного пособия является книга "MPI: The complete reference" издательства MIT Press - Вы найдете ее на этом сервере.
Отладка MPI-приложений обычным отладчиком
MPI-приложение состоит из множества процессов (по одному на каждую ветвь), в то время как большинство отладчиков позволяют отлаживать только один процесс. Здесь приведены некоторые общие советы, применимые более чем к одной из описываемых далее реализаций.
Отладка ветви, запускаемой непосредственно из mpirun (в большинстве реализаций так запускается только ветвь 0):
нет проблем, запускайте и отлаживайте.
тяжелый случай...
Можно попробовать поместить
MPI_Init() в следующее окружение:
/* в зависимости от реализации MPI, * прочие ветви в этот момент могут быть еще не запущены */ MPI_Init( &argc, &argv ); /* здесь уже все ветви заведомо запущены */ MPI_Comm_size( MPI_COMM_WORLD, &commSize ); MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); printf("Rank=%d, PID=0x%X\n", myRank, getpid() ); if( myRank==0 ) { puts("MPI_Init ok, press any key..."); getch(); /* ветвь 0 остановится здесь */ } MPI_Barrier( MPI_COMM_WORLD ); /*остальные ветви остановятся здесь*/
Администратору, выбирая реализацию MPI для установки на ту или иную машину, обязательно следует иметь представление о следующих вещах:
В многомашинной конфигурации - о каждой части MPI и MPI-приложения рекомендуется в общих чертах знать:
MPI CHameleon - это реализация, которую разработчики стандарта MPI выпускают как средство наглядной пропаганды своих замыслов. MPICH:
./configure -comm=ch_shmem ./configure -comm=ch_p4 -device=shared
По умолчанию установка производится в каталог /usr/local/mpich. Следовательно, после установки делаем:
export PATH=/usr/local/mpich/bin:$PATH export MANPATH=/usr/local/mpich/man:$MANPATHПрисутствует все необходимое: в виде man-pages, в виде HTML-страниц, в виде PostScript- и Tex- документов - в подкаталогах man, www и doc соответственно.
Профилирование: PMPI, Jumpshot
Профилирующая библиотека в MPICH идентична базовой, а функция MPI_Pcontrol ничего не делает. Таким образом, формально эта часть спецификации поддерживается, фактически - нет.
Тем не менее, в MPICH включены средства, предназначенные облегчить генерацию и обработку статистики вручную. Это набор подпрограмм CLOG_Xxx, которыми программист может пользоваться для сохранения статистических данных, и написанное на яве средство визуализации под названием Jumpshot. Ни то, ни другое мною не испытывалось.
mpirun имеет ключи для запуска приложения из-под того или иного отладчика, например, -gdb запустит GDB, -xxgdb - GDB c графическим интерфейсом для X-Window, и так далее. Поскольку GDB позволяет отлаживать только один процесс, mpirun запускает под ним нулевую ветвь. Нулевая ветвь запускается автоматически и останавливается после входа в MPI_Init(), поэтому пытаться ставить точки останова до MPI_Init() в высшей степени бессмысленно. Запуск остальных ветвей производится в MPI_Init() нулевой ветви.
В последнее время ходит много слухов о параллельном отладчике TotalView, который якобы весьма перспективен, перенесен на многие платформы и совместим с MPI. Сам я никогда его не видел, но так говорят.
Объединение нескольких машин через P4
Последовательность действий следующая:
./configure -device=ch_p4 -comm=shared
Программный файл приложения должен быть предварительно вручную скопирован на те машины, на которых его предполагается запускать mpirun'ом.
Реализации, производные от MPICH
Коммерческие реализации выпускаются производителями ЭВМ. Как правило, они напрямую основаны на MPICH, поэтому повторяют его не только вследствие стандарта, но и во многих технических мелочах. Отличия могут заключаться в:
Большинство Win32-реализаций MPI - так же не свободные, а коммерческие продукты. Это объясняется тем, что собственно MPICH изначально для переноса и оптимизации под Windows не предназначен и не приспособлен; ожидать, что эта работа будет проделана на безвозмездной основе, не приходится.
Адрес компьютера: spp.csa.ru.
MPI находится в каталоге /opt/mpi.
Это HP MPI: коммерческая реализация, оптимизированная специально
под архитектуру машин этой фирмы. Она работает на всех компьютерах
(от рабочих станций до майнфреймов) с процессорами PA RISC
и операционными системами HP-UX и SPP-UX.
Собственно, mpirun, хотя на SPP можно обойтись и без него:
./mpi_ex0 -np 5то есть mpirun не нужен, а его ключи указываются первыми в командной строке приложения.
Полезные дополнительные утилиты, в MPICH отсутствующие (подробности - в ManPages, или при запуске с ключом -help):
MPI-приложение под CXdb запускается так: все аргументы mpirun записываются в отдельный файл, назовем его mpi_ex0.cmd:
-np 4 ./mpi_ex0Команда для запуска отладчика выглядит так: cxdb -mpi mpi_ex0.cmd. Отладчик запускает программу, прогоняет ее до MPI_Init(), приостанавливает, после чего переходит в режим ввода команд.
2 предупреждения касательно точек останова:
Manual pages по HP MPI находятся в каталоге /opt/mpi/share/man:
C-Shell: setenv MANPATH /opt/mpi/share/man:$MANPATH bash: export MANPATH=/opt/mpi/share/man:$MANPATHФайл с полезной информацией по HP MPI: /opt/mpi/newconfig/RelNotes/.
Справочная информация по CXdb:
Стандартный профайлер CXpa приспособлен для работы с MPI-приложениями. я с ним не работал.
Допустим следующий способ профилирования:
mpirun -np 4 -t mystatfile program_name [program_args...]каждая ветвь в ходе выполнения будет писать статистику в свой файл, имена всех файлов будут иметь общий префикс mystat и расширение .tr
mpitrstat foo.tr | moreВот пример такого отчета:
mpitrstat HP MPI 1.2 - SPP-UX Sat Nov 7 07:58:05 1998 Application Summary Duration Average Trace Procs [secs] User MPI [kbytes] --------------------------------------------------------- foo 4 21.16959 100.00% 0.00% 0.000K Application Analysis foo Duration Process Executable Segments [secs] MPI --------------------------------------------------------- 0:11971(0) mpi_ex9 0 5.305031 0.00% 0:11972(1) ... 0 5.274548 0.00% 0:11973(2) ... 0 5.305022 0.00% 0:11970(3) ... 0 5.284993 0.00% Routine Summary Overhead Blocking Routine Calls [secs] [secs] Percent --------------------------------------------------------- USER_code 4 21.16959 0.00000 100.00% Process Summary Overhead Blocking User Process [secs] [secs] [secs] Dominating Routines ---------------------------------------------------------
mpirun -np 4 -t mystatfile:off program_name [program_args...]Собираемая статистика предназначена исключительно для профилирования MPI, а не пользовательской части приложения:
Почему на SPP не рекомендуется работать с MPI
Основных причин - три:
По-видимому, наилучшим стало бы такое разделение обязанностей:
К сожалению, в настоящий момент SPP сверх всякой меры перегружен именно рабочими расчетами некоторых особенно достойных деятелей, из-за чего 8-процессорный монстр работает как черепаха. Эта безответственная практика безнаказанно цветет столь пышным цветом, что какое-то более рациональное его использование стало практически невозможным.
WinMPICH: устаревшая реализация для Windows
Свои первые примеры на MPI я писал, используя пакет
WinMPICH 0.92b
и Microsoft Visual C++ 4.0. Все работает нормально.
К примерам прилагается make-сценарий.
WinMPICH скомпилирован в отладочном режиме, а именно...
WMPI: еще одна реализация MPICH для Windows
WMPI наиболее популярен в среде Windows в настоящий момент. Работает в '95 и в NT, с Си и Фортраном. В обоих случаях имеются в виду компиляторы от Микрософта. Путем определенных манипуляций можно заставить WMPI работать с Borland C++.
Сайт разработчиков: http://dsg.dei.uc.pt/wmpi
В HTML-формате, смотрите файл .../Docs/index.html. Описание MPI-IO (функций распределенного файлового ввода-вывода) отсутствует.
Kомандные файлы MPICC.BAT и MPIRUN.BAT отсутствуют, так как предполагается, что программист использует для работы интегрированную среду Microsoft Developer Studio, а не командную строку. Применительно к Developer Studio подробно указаны все изменения, которые требуется внести в проект по умолчанию.
Вниманию фанатов командной строки предлагается пример mpicc.bat для построения консольных WMPI-приложений.
Построенный EXE-файл запускается без всяких загрузчиков.
Он требует для работы динамическую библиотеку CVWMPI.DLL (если программа консольная) или VWMPI.DLL (если она графическая). Соответственно, Вам требуется либо вписать каталог с DLL в переменную окружения PATH, либо скопировать DLL в...:
Так гласит описание LoadLibrary в справочнике по WinAPI.
Количество и место запуска ветвей задается в текстовом файле, имеющим то же имя, что EXE-файла, плюс расширение .PG. Строки в нем имеют такой вид:
# комментарий local Количество_ветвей Адрес_машины Количество_ветвей Имя_EXE_файла
Когда PG-файл читается, ветвь номер 0 уже создана (в запущенном EXE-файле в этот момент выполняется функция MPI_Init), таким образом, общее количество ветвей на 1 больше указываемого в PG-файле. То есть, чтобы запустить приложение из 4 ветвей на своей машине, надо написать в PG-файле:
local 3
При желании, если вместо стандартного интерпретатора команд Command.com или Cmd.exe используется 4DOS или 4NT, простейший mpirun.btm может быть записан так:
@echo off :: This is mpirun.btm (4DOS/4NT batch file) sample for WMPI if "%1" ne "-np" ( echo Usage mpirun -np NN program.exe args... beep quit 1 ) echo local %@dec[%2] > %@path[%3]%@name[%3].pg set PATH=C:\Program files\WMPI_1.2\Lib\Console;%PATH% %3&
Чтобы получить подсказку по ключам запуска WMPI-приложения, запустите его с ключом -p4help.
Параллельных отладчиков для Win32 нет. Каждая отлаживаемая ветвь
должна выполняться под управлением отдельного экземпляра отладчика.
Ветвь 0 отлаживается запуском EXE-файла непосредственно
из интегрированной среды или автономного отладчика
(WinDbg для Visual C++, Turbo Debugger для Borland C++).
К остальным ветвям отладчик следует "цеплять". В DevStudio это делается
через пункт меню "Build->Start Debug->Attach to Process...".
Профилирующий вариант библиотеки, требования к которому поверхностно сформулированы в спецификации на MPI, в состав WMPI не входит. Следовательно, быстродействие коммуникационной части может замеряться лишь вручную: расставленными вокруг вызовов MPI-процедур вызовами GetTickCount() или чем-то в этом роде.
Пользовательская часть MPI-приложения может профилироваться
стандартными средствами (от Микрософт и аналогичными).
При этом, впрочем, вполне возможен конфликт ветвей,
запущенных из одного EXE-файла, так как они могут начать
писать прифилировочную статистику в один и тот же файл-отчет,
что, естественно, недопустимо.
PowerMPI для Парситека
PowerMPI - это MPICH, адаптированный к архитектуре ЭВМ Parsytec. В качестве коммуникационного уровня он использует API Parix. Файлы PowerMPI располагаются внутри каталога с Париксом (/export/home/parix/mpi на ЭВМ pink.csa.ru, /epx/mpi на всех остальных).
В построенном приложении от MPI не остается уже ничего - это обычное приложение Парикса, которое и запускаться должно командой px run. Это, кстати, означает, что при использовании PowerMPI Парситеки не могут быть объединены в MPI-кластеры ни друг с другом, ни с ЭВМ других типов. Поскольку Парcитек не cтал утруждать себя созданием таких типовых утилит, как mpicc, mpif77 и mpirun, строить MPI-приложение тоже предлагается как-то так:
px ancc mpi_sin.c -o mpi_sin.px -I/epx/mpi/include \ -L/epx/mpi/lib/parix/ch_px -lmpi
Предлагаемые здесь варианты mpicc/mpif77 и mpirun я написал, чтобы иметь меньше возни с: а) переносом готовых MPI-приложений на Парситек; б) пересаживанием закоренелых MPI-пользоватетелей на него же. Для размещения сценариев в каталоге с PowerMPI создается подкаталог bin, который затем должен быть подключен к переменной окружения PATH:
setenv PATH /epx/mpi/bin:$PATH
Замечания по mpicc:
Для этого доступны все средства, какие есть в составе Парикса. Разбираться с ними я либо не пробовал, либо пробовал, но безуспешно. Сюда относятся параллельный полноэкранный отладчик DeTop (у меня не запустился), профайлеры prof и gprof. Собственно PowerMPI в своем составе ничего ни для отладки, ни для профилирования не имеет; документация так же отсутствует.
Что будет при попытке использовать MPICH вместо PowerMPI ?
MPICH будет использовать для межузловой связи "P4 поверх TCP/IP поверх Ethernet" вместо значительно более быстрого "Parix поверх HighSpeedLink", поскольку ничего не знает о последнем.
Пользователь должен самостоятельно копировать программный файл MPICH-приложения на те узлы, на которых собирается его запускать. Для этого администратор системы должен открыть локальные диски вычислительных узлов для пользовательского доступа.
В случае, если предыдущий пункт не выполнен, или загрузчик mpirun запускается только с ключем -np, MPICH запустит приложение не на всем Парситеке, а на одном-единственном узле (надо полагать, это будет входной узел). Естественно, что в этом случае никакое распараллеливание не принесет ни малейшего выигрыша.
я пишу это все потому, что подобные попытки превратить крестьянскую лошаденку в стального коня, установив на него (на Парситек) MPICH посвежее, уже имели место в-прошлом, и нет никакой гарантии, что впредь ничего похожего больше не произойдет.
31 мая 1999 | ........ | выпущен в свет |