Руководство пользователя для MPICH, переносимой реализации MPI версия 1.2.1

William Gropp и Ewing Lusk
перевод Балуева А.Н. (мат-мех факультет СПбГУ)

Оглавление

  • 5. БИБЛИОТЕКА MPE ПОЛЕЗНЫХ РАСШИРЕНИЙ

    5. Библиотека MPE полезных расширений.

    В начало страницы

    Много новейших версий таких материалов можно найти в Руководстве пользователя для MPE и в файле mpich/mpe/README.

    Можно было предвидеть, что mpich будет продолжать набирать расширения разных родов. Мы держим их в библиотеке, которую мы назвали mpe, для

    мультипроцессорной реализации. В настоящее время главными компонентами МРЕ являются:

    Набор подпрограмм, создающих log-файлы для исследования разными графическими средствами визуализации : upshot, nupshot, Jumpshot-2 или Jumpshot-3.

    Совместная демонстрационная библиотека Х-графики.

    Подпрограммы для превращения в последовательную части кода, исполняемого параллельно.

    Отладчик для подпрограмм настройки.

    5.1 Создание Log-файлов.

    В начало страницы

    MPE предлагает несколько путей для генерирования log-файлов, описывающих ход вычислений. Эти log-файлы могут обозреваться одним из графических инструментов, поставляемых с MPE. Вдобавок вы можете заказать в этих файлах дополнительную, специфичную для вашей прикладной программы информацию. Простейший путь для генерации log-файлов – скомпоновать вашу программу со специальной библиотекой MPE, которая использует профилирующие свойства MPI для перехвата всех вызовов MPI в вашей программе. Чтобы узнать, как связаться с профилирующей библиотекой, которая автоматически выдает log-файлы, см. раздел 5.7.

    Вы можете создавать заказанные log-файлы вызовом различных регистрационных подпрограмм MPE. Детали см. в MPE man pages.

    Один пример показан в разд. 5.5.3. В последующие издания настоящего Руководства пользователя будут добавлены:

    Все регистрационные подпрограммы MPE, Пример log-файла.

    5.2 Форматы log-файлов.

    В начало страницы

    В настоящее время MPE обеспечивает 3 различных формата log-файлов, именно ALOG, CLOG и SLOG.

    ALOG предназначен для обратной совместимости и больше не совершенствуется. CLOG представляет простой перечень событий с отметками времени, который понимает программа Jumpshot-2. CLOG представляет первый формат log-файла в MPE для чтения основанными на Java инструментами визуализации. Термин SLOG есть сокращение для слов Scalable (масштабируемый) LOGfile format и основан на двойной отметке состояний во времени (doubly timestamped states). Масштабируемость SLOG проистекает от разделения всех состояний на фреймы данных, каждый из которых достаточно мал для того, чтобы эффективно обрабатываться дисплейной программой Jumpshot-3. В то время как два соседних фрейма сравниваются бок о бок, демонстрируются их состояния и стрелки, непрерывно передвигающиеся от предыдущего фрейма к следующему. SLOG и Jumpshot-3 способны обрабатывать log-файлы размерами в гигабайты. SLOG также поддерживает простую статистику смены состояний и показывает ее в окне Preview в Jumpshot-3, чтобы помочь пользователю найти интересные фреймы. См. детали в документе `mpe/viewers/jumpshot-3/doc/TourStepByStep.pdf'.

    5.3 Параллельная X-графика.

    В начало страницы

    MPE имеет набор подпрограмм, которые позволяют показывать простые графики с помощью системы X Window System. Кроме того, имеются подпрограммы ввода, такие как ввод из областей, указанных мышью. Набор имеющихся графических подпрограмм показан в Таблице 1.

    Относительно аргументов см. man pages.

    Управляющие подпрограммы MPE:

    Open graphics (коллективно) – открывает X display MPE

    Close graphics – закрывает устройство X11 graphics

    MPE Update – обновляет дисплей X11 Подпрограммы вывода MPE:

    Draw Point – рисует точку на X display MPE

    Draw Points –рисует точки на X display MPE

    Draw line – рисует линию на X11 display MPE

    Draw circle – рисует круг

    MPE Fill rectangle – рисует заполненный прямоугольник на X11 display MPE

    Draw logic – устанавливает логическую операция для новых пикселов

    MPE Line thickness – устанавливает толщину линий MPE

    Make color array – формирует массив цветных индексов MPE

    Num colors – определяет количество доступных цветов MPE

    Add RGB color – добавляет новый цвет Подпрограммы ввода MPE:

    Get mouse press – выдать координаты мыши MPE

    Get drag region – выдать прямоугольную область – Table 1: графические подпрограммы MPE Примеры использования графической библиотеки MPE можно увидеть в каталоге mpich/mpe/contrib/mandel. Выдайте make mpirun –np 4 pmandel

    чтобы посмотреть работу параллельного вычислительного алгоритма Mandelbrot'а, иллюстрирующего некоторые возможности графической библиотеки MPE.

    5.4 Другие подпрограммы MPE.

    В начало страницы

    Иногда при выполнении параллельной программы вам нужно убедиться, что несколько (а часто только один) процессоров в какое-то время что-то делают. Подпрограммы MPE.Seq.begin и MPE.Seq.end позволяют создавать «последовательные разделы « в параллельной программе.

    Стандарт MPI позволяет пользователю легко определять подпрограмму для вызова, если MPI обнаружит ошибку. Обычно вам нужно просить программу запустить отладчик, чтобы быстро понять, в чем дело. В некоторых реализациях это делает обработчик ошибок в MPE, Errors.call.dbx.in.xterm.

    Кроме того, можно скомпилировать библиотеку MPE, включающую в себя отлаживающий код. (См. параметр конфигурации –mpedbg.)

    5.5 Профилирующие библиотеки.

    В начало страницы

    Профилирующий интерфейс MPI обеспечивает удобный путь для добавления инструментария анализа производительности к любой реализации MPI. Мы демонстрируем этот механизм в mpich и предлагаем вам гибкий старт (running start), снабжая вас тремя профилирующими библиотеками, входящими в комплект поставки mpich. Пользователи MPE могут строить и использовать эти библиотеки с любой реализацией MPI.

    5.5.1 Учет затраченного времени в подпрограммах MPI.

    В начало страницы

    Первая профилирующая библиотека проста. Профилирующая версия каждой из подпрограмм MPI Xxx вызывает PMPI Wtime (которая дает отметки времени) перед и после каждого обращения к соответствующей подпрограмме PMPI Xxx. Время суммируется в каждом процессе и выдается, один файл на каждый процесс, в профилирующей версии MPI Finalize. Эти файлы затем используются либо в общем отчете, либо в отчетах по каждому процессу. Эта версия не принимает в расчет вложенные вызовы, которые происходят, когда MPI Bcast, например, реализуется в терминах MPI Send и MPI Recv.

    5.5.2 Автоматическая регистрация

    В начало страницы

    Вторая профилирующая библиотека носит название: регистрирующие библиотеки MPE. Она генерирует log-файлы, содержащие отмеченные во времени события для CLOG и отмеченные во времени состояния для SLOG. Во время выполнения программы происходят обращения к MPE Log event, чтобы записать в память события определенных типов. Потом эти буферы памяти собираются и параллельно размещаются с помощью MPI Finalize. Во время вычислений можно пользоваться подпрограммой MPI Pcontrol для задержания и перезапуска операций регистрации. (По умолчанию регистрация включена. Выполнение MPI Pcontrol(0) выключает регистрацию; MPI Pcontrol(1) опять включает ее.)

    Обращения к MPE Log event происходят автоматически при каждом вызове MPI. Анализировать полученный после окончания работы log-файл можно разнообразными средствами; они описаны в разделах 5.6.1 и 5.6.2.

    5.5.3 Специализированная регистрация.

    В начало страницы

    Вдобавок к употреблению предопределенной регистрационной библиотеки MPE для регистрации всех вызовов MPI, регистрирующие вызовы MPE могут вставляться в пользовательскую программу MPI для определения и регистрации состояний. Такие состояния называются состояниями, определенными пользователем. Состояния могут вкладываться одно в другое («гнездиться»), позволяя определять состояние, описывающее пользовательскую подпрограмму, которая содержит несколько обращений к MPI, и высветить как состояния определенные пользователем, так и операции MPI, содержащиеся в них.

    Подпрограмма MPE.Log.get.event.number должна использоваться для получения уникальных номеров событий от системы MPE (это важно, если вы пишите

    библиотеку, которая использует регистрационные подпрограммы MPE). Подпрограммы MPE.Describe.state и MPE.Log.event используются для описания состояний, определяемых пользователем.

    int eventID.begin, eventID.end; … eventID.begin = MPE.Log.get.event.number(); eventID.end = MPE.Log.get.event.number(); … MPE.Describe.state( eventID.begin, eventID.end, «Amult», «bluegreen» ); … MyAmult( Matrix m, Vector v ) – /* регистрирует начальное событие вместе с размером матрицы */ MPE.Log.event( eventID.begin, m-?n, (char *)0 ); … код Amult, содержащий вызовы MPI … MPE.Log.event( eventID.end, 0, (char *)0 ); «»

    Регистрационный файл, порожденный этим кодом, будет содержать подпрограммы MPI внутри подпрограммы MyAmult, указанной содержащим ее сине-зеленым прямоугольником. Если регистрирующая библиотека MPE, `liblmpe.a', не скомпонована с программой пользователя, то MPE.Init.log и MPE.Finish.log должны быть вставлены до и после всех вызовов MPE.

    Примеры программ `cpilog.c' и `fpi.f' находятся в исходном каталоге MPE `contrib/test' или в установочном каталоге `share/examples', чтобы проиллюстрировать употребление этих подпрограмм MPE.

    5.5.4 Анимация в реальном времени.

    В начало страницы

    Третья библиотека обеспечивает простую форму программной анимации в реальном времени. Графическая библиотека MPE содержит подпрограммы, которые позволяют некоторой совокупности процессов совместно использовать какой-то X display, не связанный с другими процессами.

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

    5.6 Вьюеры для Log-файлов.

    В начало страницы

    Имеются 4 средства графической визуализации, поставляемые с MPE: upshot, nupshot, Jumpshot-2 и Jumpshot-3. Из этих 4 вьюеров для регистрационных файлов только 3 построены средствами MPE. Это upshot, Jumpshot-2 и Jumpshot-3.

    5.6.1 Upshot and Nupshot.

    В начало страницы

    Одно средство, которое мы используем, называется upshot. Это – производное от Upshot 13, написанное в Tcl/Tk. Экранный дамп Upshot в действии показан на рисунке 2. Он показывает параллельные во времени линии.Рис. 2: Экранный дамп от upshot с состояниями процессов, подобных одному из paraGraph 12.Картинка может быть сжата или растянута в горизонтальном или вертикальном направлениях, с центром в любой точке, указанной мышью. На рис. 2 среднее окно – результат увеличения в выбранной точке верхнего окна для показа мелких деталей. Окно внизу экрана показывает гистограмму длительности состояний с несколькими регулируемыми параметрами.

    Nupshot есть версия upshot, более быстрая, но требующая старую версию Tcl/Tk. Из-за этого ограничения Nupshot не встраивается по умолчанию в текущую версию MPE.

    5.6.2 Jumpshot-2 and Jumpshot-3.

    В начало страницы

    Имеются 2 версии Jumpshot, распространяемые с MPE. Это Jumpshot-2 и Jumpshot-3, развитые из Upshot и Nupshot. Обе написаны на Java и являются графическими визуализационными средствами интерпретации двоичных файлов трассировки посредством образов на экране, как это показано на рис. 3. По поводу Jumpshot-2, см. 18 (фотографии экрана и подробности). По поводу Jumpshot-3 см. файл `mpe/viewers/jumpshot-3/doc/TourStepByStep.pdf' с кратким описанием средства. Производительность Jumpshot-2 уменьшается с увеличением log-файла, что приводит к его задержке на время чтения log-файла. Трудно определить, в какой точке Jumpshot-2 зависнет, мы сталкивались с этим и на малых файлах в 10MB. При файлах CLOG около 4MB производительность Jumpshot-2 начинает заметно отставать. В настоящее время предпринимаются усилия сделать

    основанные на Java изображающие программы значительно более масштабируемыми.

    Первый результаты этих усилий – SLOG, который поддерживает масштабируемую регистрацию данных, и Jumpshot-3, который читает SLOG.

    Рис. 3: Дисплей Jumpshot-1

    5.7. Доступ к профилирующим библиотекам.

    В начало страницы

    Если библиотеки MPE построены, доступ к ним очень прост. Конфигурация в каталоге MPE определяет путь связи, необходимый для каждой профилирующей библиотеки (слегка отличный для каждой реализации MPI). Соответствующие переменные подставляются в Makefile в каталоге `mpe/contrib/test'. Затем Makefile подставляется в каталог `share/examples' во время окончания процесса установки. Вот какая информация содержится в перечисленных ниже переменных:

    PROF LIBS – флажок компилятора, нужный для связи только с библиотекой mpe. Путь связи есть –lmpe –lpmpich или –lmpe –lpmpi в зависимости от реализации MPI.

    LOG LIBS – флажок компилятора, необходимый для связи с регистрационными библиотеками. Эти библиотеки регистрируют все обращения к MPI и генерируют log-файлы. Путь связи есть –llmpe $PROF LIB.

    TRACE LIBS – флажок компилятора для связи с библиотекой трассировки. Эта библиотека предназначена для прослеживания всех обращений к MPI. Перед каждым вызовом MPI помещается строка, содержащая ранг в MPI.COMM.WORLD вызывающего процесса, а после вызова ставится другая строка, указывающая, что вызов был завершен.

    Большинство посылающих и получающих подпрограмм также указывают значения счетчиков, меток и партнеров ( назначений при посылке, источников при получении). Для вывода используется стандартный выход. Путь связи есть –ltmpe $PROF LIB.

    ANIM LIBS – флажок компилятора для связи с библиотекой анимации, которая обеспечивает анимацию программы в реальном времени. Это требует графики MPE и использования операций X11 Window System. Может оказаться необходимым обеспечить специальный путь для библиотек X11 (вместо –lX11). Этот путь есть –lampe $PROF LIB –lX11.

    F2CMPI LIBS – флажок компилятора для связи охватывающей библиотеки Fortran to C MPI со всеми упомянутыми выше библиотеками. Для MPICH это должно быть

    -lfmpich. В противном случае это должно быть –lmpe f2cmpi, путь к собственной библиотеке MPE для преобразования Fortran к C MPI.

    FLIB PATH – флажок полного компилятора для связи программ MPI на Фортране с регистрационной библиотекой.

    Как часть процесса построения, небольшие программы `cpi.c' и `fpi.f' компонуются с каждой профильной библиотекой. Результат каждого теста связи выписывается как часть выхода построения. Если тест связи прошел успешно, то соответствующие пути связи также будут использоваться в программах пользователей. Если используемая реализация MPI есть MPICH, то дополнительный компиляторный флажок –mpilog для MPICH's mpicc/mpif77 автоматически свяжет программу пользователя с регистрационными программами MPE (-llmpe –lmpe). Библиотечный путь связи –lpmpich связывается также с профильным интерфейсом MPI, когда используется флажок –mpilog.

    Если MPI-программа на Фортране связана с MPICH, необходимо включать библиотеку `-lfmpich' перед профильными библиотеками. Это позволит использовать подпрограммы на Си для реализации профильных библиотек, используемых как в программах на Си, так и на Фортране. Например, чтобы генерировать log-файлы в программе на Фортране, нужен библиотечный флажок связи

    -lfmpich –llmpe –lmpe –lpmpich. Употребление mpif77 –mpilog автоматически свяжет со всеми этими библиотеками. Если используемая реализация MPI есть не

    MPICH, необходимо включить библиотеку `-lmpe f2cmpi' (собственная библиотека MPE, охватывающая Fortran to C MPI) вместо библиотеки `-lfmpich'. И опять эта связь должна быть указана раньше всех профилирующих библиотек. То есть, флажок связи компилятора должен быть –lmpe f2cmpi –llmpe –lmpe –lpmpi –lmpi, Можно комбинировать автоматическую регистрацию с ручной. Автоматическая регистрация будет регистрировать все обращения к MPI. Она будет производиться при связи с $LOG LIBS. Ручная регистрация производится вставленными пользователем обращениями к подпрограммам MPE, расположенными вокруг вызовов MPI. В таком случае будут регистрироваться только избранные вызовы MPI. Однако, если нужна комбинация этих двух типов регистрации, пользователь не должен вставлять в свою программу обращений к MPE Init log и MPE Finish log. Потому что в присоединенной регистрирующей библиотеке MPI Init будет вызывать MPE Init log и MPI Finalize будет вызывать MPE Finish log.

    5.8 Автоматическая генерация профилирующих библиотек.

    В начало страницы

    Для каждой из этих библиотек процесс построения очень прост. Сначала должны быть написаны профилирующие версии MPI Init и MPI Finalize. Профилирующие версии других подпрограмм MPI имеют подобный им стиль. Код каждой выглядит подобно следующему

    int MPI.Xxx( . . . ) – нечто для кода возврата профильной библиотеки = PMPI.Xxx( . . . ); нечто другое для кода возврата профильной библиотеки;«»

    Мы генерируем эти подпрограммы, написав части «нечто» только один раз, в схематической форме, а затем автоматически расставляем их вокруг вызовов PMPI. Поэтому генерировать профилирующие библиотеки легко. См. файл README в mpich/mpe/profiling/wrappergen или приложение A.

    Примеры того, как писать трафареты для размещения вокруг, находятся в подкаталоге mpe/profiling/lib. Там вы найдете исходные коды ( .w-файлы) для создания трех упомянутых выше профилирующих библиотек.

    Пример Makefile'а для этого помещен в каталоге mpe/profiling/examples.

    5.9 Инструментарий для управления профилирующими библиотеками.

    В начало страницы

    Примеры профилирующих оболочек для mpich поставляются как коды определения оболочек. Такие коды выполняются с помощью средств генерации оболочек wrappergen

    utility – генерация оболочек? для порождения Си-кода (см. раздел 5.8). Любое количество определений оболочек могут быть использованы вместе, так что любой уровень вложения профилирующих оболочек допустим при генерации оболочек. Несколько примеров определений оболочек поставляются с mpich:

    timing

    Использует MPI.Wtime() для слежения за общим количеством обращений к каждой из функций MPI и временем, потраченным в этой функции. Это просто сводится к запоминанию значений таймера до и после вызова функции, без вычитания времени,

    потраченного на обращения к другим функциям. logging Создает logfile всех pt2pt вызовов функций. vismess Выталкивает pop up X-окно, которое позволяет увидеть все передаваемые сообщения. allprof

    Включает все, приведенное выше. Это иллюстрирует, как несколько профилирующих библиотек могут быть скомбинированы.

    Замечание: эти оболочки не используют никаких специфических свойств mpich, кроме графики MPE и регистрации в `vismess' и `logging' соответственно.

    Они работают в любых реализациях MPI.

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

    Генерировать исходные коды для желаемых оболочек с помощью wrappergen. Это может быть сделано одновременно one-time task. Компилировать коды для оболочек.

    Не забудьте при этом включить необходимые параметры компиляции. `vismess' и `logging' требуют MPE-библиотеку (`-lmpe'), а определение оболочки `vismess' требует MPE GRAPHICS.

    Скомпонуйте компилированный код оболочки с профилирующей версией библиотеки mpi и со всеми другими необходимыми библиотеками (`vismess' требует X) с вашей прикладной программой. Требуемый порядок таков:

    $(CLINKER) !application object files…? « !wrapper object code? «

    !other necessary libraries (-lmpe)? « !profiling mpi library (-lpmpich)? « !standard mpi library (-lmpi)?

    Для упрощения этого, созданы некоторые примеры частей makefile'ов в `mpich/mpe/profiling/lib':

    Makefile.timing – timing-оболочки Makefile.logging – logging-оболочки Makefile.vismess – оболочки анимационных сообщений Makefile.allprof – timing, logging, и vismess Чтобы использовать эти фрагменты Makefile'ов:

    1. (выборочно) Добавьте $(PROF.OBJ) к списку зависимости вашей прикладной программы:

    myapp: myapp.o $(PROF.OBJ)

    2. Добавьте $(PROF.FLG) к вашей строчке CFLAGS в строке компиляции: CFLAGS = –O $(PROF.FLG)

    3. Добавьте $(PROF.LIB) к вашей строке компоновки после вашего объектного кода, но перед библиотекой MPI:

    $(CLINKER) myapp.o –L$(MPIR.HOME)/lib $(PROF.LIB) –lmpich

    4. (выборочно) Добавьте $(PROF.CLN) к вашей чистой цели clean target: rm –f *.o *~ myapp $(PROF.CLN)

    5. Включите желаемый фрагмент Makefile'а в ваш makefile: include $(MPIR.HOME)/mpe/profiling/lib/Makefile.logging или

    #include $(MPIR.HOME)/mpe/profiling/lib/Makefile.logging , если вы используете совершенно несовместимый полученный из BSD 4.4 make-файл ?)


<<< Оглавление Страницы: 5  6 >>>