Язык отладки.

 

Определено два уровня сбора отладочной информации. По-умолчанию собирается информация только об операциях коммуникаций между процессами (имя MPI функции, ранк процесса источника/приемника сообщения, время исполнения и позиция в коде). Если этого не достаточно для анализа поведения программы, пользователь может указать дополнительную информацию для сбора. Указания делаются с помощью языка отладки.

Языка отладки состоит из инструкций, которые вставляются в исходный код программы. Каждая инструкция является комментарием языка программирования (в данном случае С) и имеет следующий вид:

/*GPRD <инструкция> */,
где <инструкция> - определение информации, которую необходимо собрать дополнительно.

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

/*GPRD COUNT */,
Аналогично можно вести подсчет количеству вызова функций.

Ожидаемая система межпроцессного взаимодействия также может быть описана с тем, чтобы отладчик произвел ее сравнение с тем, что получилось при исполнении программы. Система коммуникаций задает отношение на множестве процессов. Отношение процессов задается множеством пар вида (ранк источника, ранк приемника). Для описания отношений в языке отладки предусмотрено ряд инструкций.

/*GPRD SCOMMSET $i SEND ($i-1, $i+1) */
Пример выше показывает способ указания того, что iый процесс может отправлять сообщения следующему и предыдущему процессу в некой линейке процессов. Система коммуникаций динамична и может меняться в процессе исполнения программы. Также пользователь может переопределять и ожидаемую систему межпроцессного взаимодействия.

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

На текущий момент собирается информация и производится анализ только следующих функций MPI

MPI_Init
MPI_Finalize
MPI_Send
MPI_Recv
MPI_Bcast
MPI_Reduce
MPI_Isend
MPI_Irecv
MPI_Wait
MPI_Scatter
MPI_Scatterv
MPI_Gather
MPI_Gatherv
MPI_Comm_dup
MPI_Cart_create
MPI_Comm_split
MPI_Comm_free

Список инструкций языка отладки

Управление сбором информации

Область действия инструкций - до вызова функции MPI_Init

Установление размера буфера MON для хранения отладочной информации перед запиью в файл. Размер задается в килобайтах. Размер по умолчанию - 32КБ. Изменения производятся только до вызова функции MPI_Init

/*GPRD BUFFER = _размер_ */

Установление интервала сбора данных о загрузки операционной системы (load avarage). Интервал задается в секундах. Минимальный интервал равен 1 секунде. Значение по умолчунию - 5 секунд.

/*GPRD LAVGTO = _интервал_ */

Установление интервала "бездействия" - максимального времени, в течении которого должна быть выполнена хотя бы одна операция коммуникации. Интервал задается в секундах. Минимальный интервал равен 1 секунде. Значение по умолчунию - 5 секунд.

/*GPRD IDLETO = _интервал_ */

Установление интервала ожидания завершения операции коммуникации - максимальное время исполнения функции по приему, передачи данных, синхронизации. Полезно для отслеживания "мертвых" блокировок. Интервал задается в секундах. Минимальный интервал равен 1 секунде. Значение по умолчунию - 5 секунд.

/*GPRD KILLTO = _интервал_ */

Сбор дополнительной информации

Область действия инструкций - между вызовами функций MPI_Init и MPI_Finalize

Фиксирование факта достижения какого-либо участка кода

/*GPRD ENTRY */

Подсчет количества достежений какого-либо участка кода

/*GPRD COUTN */

Разметка кода производится инструкцией

/*GPRD SECTION name */
Детельное описание в разделе "Разметка кода"

Проверка системы коммуникаций

Для проверки системы коммуникаций предусмотренно две инструкции. Их синтаксис имеет следующий вид

Инструкция SCOMMSET устанавливает ограничения на пересылку сообщений через коммуникатор. Инструкция SCOMMRST эти ограничения снимает. Считается, что если ограничения не заданы, то возможны пересылки сообщений любому процессу и прием от любого процесса используя заданый коммуникатор. В противном случае допустимы только пересылки, которые описаны с помощью инструкции SCOMMSET.

Если при задании/сбросе проверки системы коммуникаций не задан коммуникатор COMM, операция применяется к коммуникатору MPI_COMM_WORLD.