2007
ВЕСТНИК ПЕРМСКОГО УНИВЕРСИТЕТА
Математика. Механика. Информатика Вып. 7(12)
УДК 681
Опыт разработки интеллектуального отладчика программ моделирования на МР1
Е. Б. Замятина, А. С. Козлов
Пермский государственный университет, 614990, Пермь, ул. Букирева, 15
Обсуждаются вопросы создания инструментальных средств, предназначенных для отладки параллельных программ, разработанных с применением библиотеки MPI. Рассматривается опыт разработки инструментального средства с интеллектуальным компонентом, который помогает обнаруживать тупиковые ситуации, возникающие при выполнении MPI-программ и ряд других ошибок. Отладчик может быть использован студентами, выполняющими работы на кластере механико-математического факультета, для отладки программ.
Введение
В настоящее время сложность требующих решения задач постоянно растет, а значит необходимо увеличение мощности вычислителей. Для повышения мощности вычислительных средств часто применяют экстенсивный подход - увеличение числа процессоров в рамках одного вычислителя (кластеры, вычислители с многоядерной архитектурой). Это, а также использование соответствующих параллельных алгоритмов позволяет многократно увеличить вычислительную мощность системы.
Разработка и реализация параллельных алгоритмов не являются тривиальными. Они требуют применения новых решений, новых подходов, новых программных средств.
Процесс разработки параллельных программ качественно отличается от процесса разработки последовательных. Для этих программ неприменимы стандартные методы отладки (трудно воспроизвести ситуацию, которая привела к той или иной ошибке, трудно локализовать ошибку и т.д.), поэтому возникает проблема разработки эффективных
Работа выполнена при поддержке гранта © Е. Б. Замятина, А. С. Козлов, 2007
инструментальных средств отладки параллельных программ.
В настоящее время широко используются многопроцессорные вычислительные системы с кластерной архитектурой. Для разработки программ здесь часто обращаются к популярным библиотекам MPI и PVM.
Авторы статьи предприняли попытку разработать инструментальное средство для отладки параллельных MPI-программ (программ, написанных с использованием библиотеки MPI). Необходимость разработки отладчика продиктована тем, что механикоматематический факультет располагает кластером, который используется студентами факультета для выполнения лабораторных, курсовых и дипломных работ.
Разрабатываемое инструментальное средство представляет собой интеллектуальный отладчик, который позволяет обнаруживать тупиковые ситуации, локализует их и предлагает решения для устранения этих ошибок.
Разработка такого отладочного средства разбивается на следующие задачи:
1. Протоколирование работы программы.
07-01-96042-р-урал_а и гранта 07-07-00412_а.
2. Использование накопленной информации для идентификации и локализации ошибок.
3. Построение базы знаний на основе проведенной классификации для выработки рекомендаций пользователю в устранении ошибки.
Исследования операций обмена данными библиотеки MPI позволили определить классы ситуаций, которые могут привести к тупикам. Для протоколирования работы программы была разработана структура файла протоколирования и правила для локализации ошибок.
Далее рассмотрим более подробно проблемы, которые возникают при отладке параллельных программ, и уже существующие программные средства отладки.
Проблемы отладки параллельных программ
Отладка параллельных программ не является тривиальным этапом их разработки. Одна из причин - это отсутствие детерминированности выполнения параллельной программы. Недетерминированность выполнения объясняется тем, что не всегда известно, на каком из вычислительных узлов (а это может быть узел гетерогенной сети) выполняется тот или иной процесс, порожденный программой. Очень часто распределение процессов по вычислительным узлам происходит случайным образом.
Также источником недетерминированности является зависимость некоторых параллельных программ от набора входных данных: в зависимости от данных программа порождает процессы для их обработки. Поэтому заранее неизвестно, сколько процессов будет порождено и как они будут взаимодействовать между собой. Построить модель такой программы крайне сложно.
Одно из частных решений задачи отладки параллельных программ - жестко закреплять процессы за соответствующими вычислительными узлами.
Для некоторых алгоритмов можно применить статическую отладку. Статическая отладка предполагает анализ параллельного алгоритма, применение формальных методов. Это может быть исследование алгоритмов с помощью сетей Петри или с применением графовой событийной модели программы [1,
2]. Однако статическая отладка не может предупредить всевозможные ошибочные ситуации. Как уже упоминалось ранее, это частное решение проблемы. Итак, следует дополнять статическую отладку динамической отладкой. Использование отладчика при выполнении программы позволяет выявить и локализовать некоторые ошибки, но не следует забывать, что любое отладочное средство оказывает влияние на выполнение параллельной программы (появляются дополнительные действия).
При отладке последовательной программы контекст задачи в точке останова сохраняется и пользователь имеет возможность анализировать его сколь угодно долго. Для параллельных программ это неприемлемо, поскольку остановка любого из процессов приводит к нарушению контекста всей задачи, так как нарушается контекст всех или части ее неостановленных процессов. Остановка всех процессов программы также не дает гарантированного сохранения контекста каждого из процессов и всей программы в целом. Это объясняется наличием задержки между отправкой служебного сообщения об остановке процессов и реакцией отлаживаемой программы на них. Некоторые процессы будут остановлены раньше других, что нарушает контекст остальных.
Существуют альтернативные системы отладки - инструментальные средства, основанные на мониторинге программы. Такие средства пассивно собирают информацию о выполняемой программе. Но и они оказывают влияние на естественный ход выполнения процессов. Это влияние должно быть учтено и скомпенсировано при обработке собранной отладочной информации.
Возможности отладчиков, основанных на системах мониторинга, ограничены [3]. В некоторых случаях набора отладочной информации, который они могут предоставить, явно недостаточно для локализации места ошибки. С другой стороны, избыточный объем информации, собранный интерактивным отладчиком, в большинстве случаев абсолютно бесполезен. То есть причина возникновения рассматриваемой проблемы и ее актуальность складываются из того, что разработчики отладочных инструментальных средств вынуждены постоянно искать баланс между полнотой множества собранной отладочной информации и ее достоверностью.
Далее рассмотрим существующие отладочные средства.
Средства отладки параллельных программ
Как уже упоминалось ранее, для отладки параллельных программ применяют как статическую, так и динамическую отладки. Среди существующих отладочных средств можно выделить следующие [3]:
1. Meander. Этот проект располагает средствами как статической, так и динамической отладки. В состав системы входит графический редактор структуры программы, статические анализаторы графовых структур и последовательных фрагментов кода, средства автоматического преобразования спецификаций в команды. Предметная область, в рамках которой разрабатываются программы, -математические расчеты (численное решение систем уравнений и т. д.).
2. COVERS. Основная цель данного отладчика - поиск тупиков посредством анализа структуры программы в виде графа ресурсов и процессов. Также система располагает широким набором средств для сбора информации о программе во время ее выполнения.
3. Hence. Проект предназначен для работы в среде X Windows на различных рабочих станциях Unix. Параллельные программы используют библиотеку PVM. В Hence довольно слабая поддержка механизмов отладки. Проект ориентирован в основном на помощь программисту в разработке параллельных программ.
4. TotalView. Коммерческий проект из Германии. Он предназначен для интерактивной отладки параллельных программ, которые выполняются на вычислительных системах как с разделяемой, так и с общей памятью.
5. RAMPA. Проект Института прикладной математики им. М.В.Келдыша РАН. Система предназначена для разработки и отладки параллельных программ, написанных на языках Fortran DVM и НОРМА.
6. AIMS (Automated Instrumentation and Monitoring System). Некоммерческий продукт, который разрабатывается в NASA Ames Research Center в рамках
программы "High Performance Computing and Communication Program". Программа предназначена для построения трасс и их визуализации. Кроме того, возможен сбор статистики по вызовам процедур. Поддерживаемые языки -Fortran 77, HPF, C; библиотеки передачи сообщений - MPI, PVM, NX. Поддерживаемые платформы - IBM RS/6000 SP, SGI, Cray T3D/T3E.
7. Vampir. Коммерческий продукт. Разработка компании Pallas (Германия). Программа предоставляет пользователю трассировку выполнения программы и её визуализации. Поддерживаемые языки - Fortran, C. Библиотека передачи сообщений - MPI. Поддерживается большое количество платформ как с общей, так и с разделяемой памятью.
8. JampShot. Некоммерческое средство, разработанное в Арагонской национальной лаборатории, предназначенное только для визуализации потоков данных. К существенным недостаткам этого продукта можно отнести невозможность задания рамок, в которых производится отладка и невозможность сбора никакой отладочной информации, кроме информации об операциях коммуникации.
9. Pablo Performance Analysis Toolkit Software. Некоммерческий проект, разработанный в университете штата Иллинойс. Пакет состоит из программ и библиотек сбора статистики, трасс и визуализации, ориентирован на языки ANSI C, Fortran 77, Fortran 90 (с ограничениями), HPF (Portland Group) и разрабатывался для платформ с общей памятью: Sun Solaris, RS6000, SP2, Intel Paragon, Convex Exemplar, SGI IRIX.
10. Paradyn. Некоммерческое средство, разработанное в университете Висконсина. Предназначено для интерактивного анализа параллельных программ, написанных на языках Fortran 77, Fortran 90, C, C++. Поддерживаемые библиотеки - MPI и PVM. Поддерживаемые платформы - Sun SPARC (только PVM), Windows NT, IBM RS/6000 (AIX 4 и старше).
Далее остановимся на особенностях реализации разрабатываемого отладчика
Deadlock Detector, который отличается от упомянутых выше тем, что он имеет интеллектуальный компонент, в котором накапливается информация об обнаруженных ошибках и правила их локализации. На настоящем этапе разработки отладчик Deadlock Detector используется для обнаружения ошибок в программах, написанных на MPI, и в основном рассчитан на обнаружение тупиковых ситуаций.
Прежде чем приступить к рассмотрению особенностей организации интеллектуального отладчика, кратко расскажем о библиотеке MPI.
Библиотека MPI
Известно, что MPI - это библиотека процедур и функций, реализующая интерфейс обмена сообщениями для архитектур с общей памятью, архитектур с раздельной памятью, кластеров и гетерогенных вычислительных сетей [4]. К основным характеристикам библиотеки MPI можно отнести следующие:
1. MPI предоставляет разработчику стандартизованный набор коммуникационных механизмов, которые реализованы для множества вычислительных архитектур (стандартизация).
2. Параллельная программа может быть написана один раз и перенесена на любую платформу, для которой имеется реализация MPI (переносимость).
3. При проектировании и кодировании стандарта MPI использовались архитектурные особенности вычислительных платформ, благодаря чему на каждой из платформ механизмы коммуникации реализуются через базовые архитектурные решения вычислителя, что дает прирост производительности за счет оптимизации выполняемых действий (эффективность).
4. Стандарт библиотеки MPI 1.0 включает в себя более 130 функций (функциональность).
5. Реализации MPI можно получить как от производителей вычислительных машин, так и из открытых источников, занимающихся реализацией и поддержкой стандарта MPI (доступность). Заметим, что в MPI-программе не предусмотрен механизм обработки ошибочных ситуаций. Так, программа может зайти в тупик в результате неправильного порядка вы-
зова блокирующих коммуникационных функций или аварийно завершиться в результате вычислительной ошибки.
В случае аварийного завершения процесса программы невозможно зарегистрировать сам факт сбоя, вследствие чего нет возможности адекватно среагировать на ошибочную ситуацию: динамически запустить клон неудачно завершившегося процесса или перераспределить незавершившуюся подзадачу среди процессов, успешно продолжающих свое выполнение.
MPI-система состоит из двух основных частей: это библиотека функций, реализующая коммуникационный механизм, и демон, контролирующий корректность преобразования типов при пересылке и реализующий сами механизмы пересылки данных между процессорами вычислителя.
Итак, разработка отладочного средства для MPI-программ является достаточно актуальной. Рассмотрим более подробно особенности его архитектуры.
Интеллектуальный отладчик Deadloc Detector
Интеллектуальный отладчик включает в себя интеллектуальный компонент, который выполняет следующие функции: сбор отладочной информации, ее анализ и поиск рекомендаций по локализации и исправлению обнаруженной ошибки. Соответственно интеллектуальный компонент состоит из 3 блоков: блока сбора информации, блока анализа и блока классификации.
Блок сбора информации хранит информацию в специальном файле, который назовём лог-файлом. Следует отметить, что для сбора отладочной информации была разработана структура этого файла, которая существенно отличается от стандартных SLOG и CLOG (нет избыточной информации). Для записи информации в файл были использованы функции MPI: MPI_File_write_shared() и MPI_File_sync().
Блок анализа ситуации по текущему состоянию вычислительного кластера, выполняющихся процессов и информации из лог-файла определяет тип ошибки. В настоящее время выполняется анализ таких ошибок, как тупик, зацикливание и т.д.
На следующем этапе блок анализа отладочной информации на основе информации из
лог-файла и типа ошибки должен обнаружить те события, которые привели к этой ней. Кроме того, блоку анализа необходимо установить конкретные строки кода процессов, приводящие к появлению этих событий. В функции блока анализа также входит уведомление пользователя об ошибке.
На блок классификации возлагается обязанность указать причину ошибки и дать конкретные рекомендации по ее устранению Таким образом, блок анализа играет роль "переходника" между лог-файлом и экспертной системой, в его обязанности входит на основе лог-файла дать ответ на вопросы экспертной системы. Примером вопроса может быть следующий: "Есть ли в программе незавершенные операции приема MPI_Recv()?", на который блок анализа отладочной информации должен выдать определенный ответ, а если надо, то и найти конкретные вызовы или подсчитать их количество.
Экспертная система, реализующая блок классификации, имеет традиционную архитектуру: базу знаний, компонент приобретения знаний, компонент объяснения, механизм логического вывода, рабочую память и диалоговый компонент.
Ниже приведена программа, в которой тупик возникает вследствие двух взаимно блокирующих операций приема.
Текст программы:
#include "mpi.h"
#include <stdio.h>
int main (int argc, char *argv[])
{
int myrank, message, size; int tag=0;
MPI Status status;
MPI Init(&argc, &argv); MPI~Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD,
&size);
message = 314; if (myrank == 0)
{
MPI Recv(&message, 1, MPI_INT, 1, tag", MPI_COMM_WORLD, &status);
MPI Send(&message, 1, MPI_INT, 1, tag", MPI_COMM_WORLD);
}
else
{
MPI Recv(&message, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
MPI Send(&message, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
}
MPI Finalize(); return 0;
}
На рисунке приводится результат работы компонента визуализации отладочной информации для случая взаимной блокировки (эллипсы в начале дуг указывают на процесс-инициатор операции):
Окно компонента отладочной информации, иллюстрирующей возникновение тупиковой ситуации
Итак, опыт разработки интеллектуального отладчика показал, что отладочные средства параллельных программ могут не только выполнять их трассировку (как это делается в подавляющем большинстве отладочных инструментальных средств), но и локализовать ошибки, указывая на причину их возникновения, а также вырабатывать рекомендации по устранению этих ошибок. Следует отметить, что пользователь имеет возможность увеличить количество распознаваемых типов ошибок, поскольку в Deadlock Detector предусмотрено инструментальное средство для расширения базы знаний.
Список литературы
1. Немнюгин С., Стесик О. Параллельное программирование для многопроцессорных вычислительных систем. СПб.: БХВ-Петербург, 2002. 400 с.
2. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: БХВ-Петербург, 2002. 608 с.
3. Петренко А.К. Методы отладки и мониторинга параллельных программ (обзор) // Программирование. 1994. № 3.
4. Message Passing Interface. SP Programming
Workshop. Режим доступа: http
//www.hpcc.edu/training/workshop/mpi/main.
htm.
Intelligent debugger for MPI programs
E. B. Zamyatina, A. S. Kozlov
Perm State University, 614990, Perm, Bukireva st., 15
This paper deals with software for parallel program debugging. Parallel program mentioned above use the special communication MPI library. Authors discuss the problem of parallel program debugging, inform about modern parallel programs debuggers and suggest to solve this problem (the problem of error detection in parallel software) applying expert systems. This paper describes intelligent component, which is included in debugger. Intelligent component helps to detect deadlock conditions while MPI program running. The debugger can be used by students of mathematical department who deal with parallel programs.