debugDDr (1158410), страница 6
Текст из файла (страница 6)
Параметры задаются в специальных файлах, располагающихся в специальной директории DVM-системы. Параметры имеют следующий вид:
<Имя параметра>=<Значение>.
Динамическим контролем используются следующие значения:
EnableDynControl – динамический контроль выполняется, если параметр больше 0, и динамический контроль запрещен при значении 0.
DebugOptions.ErrorFile – имя файла с диагностикой об ошибках. В данный файл выводятся сообщения об ошибках, найденных при динамическом контроле, если значение параметра DebugOptions.ErrorToScreen равно 0. Если попытки открытия файла окажутся неуспешными, то диагностика будет выводиться на экран.
DebugOptions.HashIndexSize – размер индекса хеш-таблицы для таблицы переменных.
DebugOptions.HashTableSize – размер массивов хеш-таблиц.
DebugOptions.VarTableSize – размер таблиц переменных.
DebugOptions.ErrorToScreen – если значение не равно 0, то вся диагностика динамического контроля выводится на экран.
DebugOptions.PrintStatistic – если значение параметра не равно 0, то по окончании работы программы печатается статистика работы с таблицей переменных. Статистика выводится в файл DebugOptions.ErrorFile или на экран в зависимости от значения параметра DebugOptions.ErrorToScreen.
DebugOptions.AppendErrorFile – определяет режим записи в файл диагностики при его использовании. Если значение равно 0, то при каждом запуске задачи содержимое этого файла стирается.
DebugOptions.MaxErrors – определяет максимальное число ошибок, после которого динамический контроль будет отключен.
DebugOptions.CheckVarInitialization – если значение не равно 0, то разрешена проверка инициализации скалярных переменных.
DebugOptions.CheckVarReadOnly – если значение не равно 0, то разрешена проверка использования переменным с доступом только на чтение.
DebugOptions.CheckReductionAccess – если значение не равно 0, то разрешена проверка использования редукционных переменных.
DebugOptions.CheckDisArrInitialization – если значение не равно 0, то разрешена проверка инициализации элементов распределенных массивов.
DebugOptions.CheckDisArrLimits – если значение не равно 0, то разрешена проверка обращений к элементам распределенного массива за пределами его границ.
DebugOptions.CheckDisArrEdgeExchange – если значение не равно 0, то разрешена проверка обмена теневых граней распределенных массивов.
DebugOptions.CheckDisArrSequentialAccess – если значение не равно 0, то разрешена проверка использования элементов распределенных массивов в последовательной части программы.
DebugOptions.CheckDisArrLocalElm – если значение не равно 0, то разрешена проверка на принадлежность элемента распределенного массива его локальной части.
DebugOptions.CheckDataDependence – если значение не равно 0, то разрешена проверка на зависимость параллельных циклов по данным.
DebugOptions.CheckRemoteBufferAccess – если значение не равно 0, то разрешена проверка использования буферов удаленного доступа.
HashMethod – определяет алгоритм вычисления хеш-значения. 0 – используется функция StandartHashCalc, 1 – используется функция OffsetHashCalc.
HashOffsetValue – величина смещения для алгоритма OffsetHashCalc. Допускаются значения от 0 до 16.
6Метод сравнения результатов выполнения
6.1Накопление трассировки
При накоплении результатов вычислений в файл записывается следующая информация:
-
Значения всех переменных при доступе к ним на чтение.
-
Значения всех переменных при доступе к ним на запись.
-
Значения результатов вычисления редукции.
-
Начало выполнения области параллельных задач и параллельного или последовательного цикла.
-
Начало выполнения нового витка цикла или новой параллельной задачи.
-
Завершение выполнения области параллельных задач и параллельного или последовательного цикла.
Каждая запись в файле содержит ссылку на соответствующую строку исходного текста программы.
Поскольку метод сравнения результатов требует значительных накладных расходов, то предусмотрены средства управления степенью подробности накопления результатов выполнения.
Степень подробности накопления определяется содержимым специального файла – конфигурационного файла трассировки. Этот файл содержит описание всех исполняемых конструкций программы (области задач и циклы). Если данный файл не существует, то можно с помощью параметров задать его создание.
Для того чтобы сократить объем накапливаемой информации, для каждого цикла, для каждой области задач и для всей программы в целом можно задать следующие уровни накопления:
-
Отсутствие трассировки.
-
Трассировка только начала и завершения областей задач и начала самих задач, начала и завершения циклов и начала витков циклов.
-
Предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции.
-
Полная трассировка (включает трассировку всех событий).
Кроме того, для каждого цикла можно указать диапазон витков, по которым будет накапливаться трассировка, а для области задач – диапазон трассируемых задач.
6.2Сравнение результатов
В режиме сравнения трассировки, эталонный файл перед началом выполнения программы, считывается в память. При чтении трассировки из файла, ее структура в памяти формируется с помощью тех же функций, что и в режиме накопления трассировки. В результате, после чтения трассировки из файла, мы имеем в памяти ту же структуру, которая была сформирована при накоплении трассировки.
При последующем выполнении программы, трассируемые события сравниваются с эталонными.
При этом, учитываются следующие особенности выполнения программы в параллельном режиме:
-
Значения редукционных переменных внутри параллельных конструкций могут различаться при последовательном и параллельном исполнении программы. Поэтому, сравнение значений таких переменных не производится.
-
При параллельном выполнении программы может поменяться порядок выполнения витков цикла или параллельных задач. В связи с этим, в начале выполнения каждого витка или задачи, производится поиск соответствующей записи в эталонной трассировке и установление ее как текущей.
-
В последовательной части программы при параллельном ее исполнении могут отсутствовать некоторые обращения к элементам распределенных массивов, предваренные проверкой принадлежности этих элементов текущему процессору.
-
В параллельной конструкции могут отсутствовать некоторые обращения к переменным, участвующим в вычислении редукционного максимума или минимума.
6.3Контроль редукционных операций
Накопление редукционных переменных осуществляется специальным образом. Значения редукционных переменных во время их вычисления в параллельном цикле не сравниваются с эталонными. Сравниваются только результаты окончательного вычисления редукции.
Для контроля правильности спецификации редукционной операции, вычисление редукционной операции производится двумя различными способами. Первый способ – это стандартный метод вычисления редукции. Сначала на каждом процессоре выполняются отображенные на него витки параллельного цикла или параллельные задачи, в которых в соответствии с заданным программистом алгоритмом будет вычислен частичный результат редукции. Конечный результат редукционной операции вычисляется библиотекой Lib-DVM путем объединения всех частичных результатов в соответствии с описанной программистом редукционной операцией. Если программа выполняется последовательно (или параллельно, но на одном процессоре), то редукционная операция целиком будет вычислена в соответствии с заданным программистом алгоритмом.
Второй способ представляет собой эмуляцию выполнения каждого витка параллельного цикла и каждой параллельной задачи на своем процессоре, осуществляемую следующим образом. Перед началом выполнения очередного витка или задачи текущее значение редукционной переменной сохраняется, а редукционной переменной присваивается ее начальное значение, т.е. то значение, которое она имела перед началом выполнения параллельной конструкции. После выполнения витка или задачи, над сохраненным значением редукционной переменной и полученным в редукционной переменной частичным результатом выполняется заданная программистом операция редукции.
Для проверки правильности задания редукционной операции производится сравнение результатов выполнения программы с использованием двух описанных выше способов вычисления редукции. Если редукционная операция в программе задана правильно, то при обоих способах вычисления редукции получится одинаковый результат. При неверном задании операции редукции пользователь получит диагностику о расхождении результатов выполнения редукции.
6.4Форматы входных и выходных файлов
6.4.1Конфигурационный файл трассировки
Этот файл служит не только для задания степени подробности трассировки для каждой конструкции программы, но и для выдачи программисту объемов трассировки при заданных уровнях ее подробности. Запуская программу в режиме формирования конфигурационного файла (без реального накопления трассировки) и корректируя каждый раз получаемый файл, программист имеет возможность добиться наиболее подходящей степени подробности трассировки.
Как уже было сказано, существуют следующие уровни подробности трассировки:
-
отсутствие трассировки (уровень NONE);
-
трассировка начала и завершения циклов или областей задач и начала витков или задач (уровень MINIMAL);
-
предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции (уровень MODIFY);
-
трассировка всех событий (уровень FULL).
Уровень подробности трассировки всей программы задается при запуске программы в файле параметров. Уровень подробности трассировки для каждой конструции программы задается в конфигурационном файле. Если уровень подробности для конструкции не задан, то он наследуется от объемлющей конструкции. Если объемлющей конструкции не существует, то принимается уровень всей программы.
Для всей программы и для конструкции программы отдельно конфигурационный файл содержит следующую информацию: число строк в файле трассировки, размер трассировки в байтах и общее число выполненных витков циклов или задач. Если конструкция выполняется несколько раз, то по ней дается суммарная информация.
Дополнительно, для каждой конструкции приводится ее номер, номера строк начала и конца конструкции в исходном файле, уровень подробности трассировки и множество трассируемых витков или задач. Пользователь может менять только уровень подробности трассировки и множество трассируемых витков или задач.
Комментарии в конфигурационном файле начинаются с символа ‘#’. Вся строка после этого символа игнорируется.
Структура конфигурационного файла следующая:
# Trace size = <объем всей трассировки>
# String count = <число строк всей трассировки>
<SL | PL | TR> <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла>] {<имя файла>, <номер строки>} = <NONE | MINIMAL | MODIFY | FULL>, (<измерение>:<первый виток>, < последний виток>, <шаг >), …
# Trace size = <объем трассировки конструкции>
# String count = <число строк трассировки конструкции>
# Count of traced iterations = <число трассируемых витков или задач>
EL: <номер конструкции>
………
<SL | PL | TR> <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла>] {<имя файла>, <номер строки>} = <NONE | MINIMAL | MODIFY | FULL>, (<измерение>:<первый виток>, < последний виток>, <шаг >), …
# Trace size = <объем трассировки конструкции>
# String count = <число строк трассировки конструкции>
# Count of traced iterations = <число трассируемых витков или задач>
EL: <номер конструкции>
Все параметры исполняющихся конструкций задаются после символа ‘=’. Запись SL соответствует обычному последовательному циклу, запись LP соответствует параллельному циклу а запись TR – области параллельных задач.
Если множество трассируемых витков не задано, то будут трассироваться все витки или задачи. Множество витков задается следующим образом:
(<измерение> : [<первый виток>] , [<последний виток>] , [<шаг>])
<измерение> – измерение цикла (начинается с 0) для которого задается диапазон. Области задач и последовательные циклы всегда имеют только одно измерение с номером 0. Данный параметр обязателен.
<первый виток> – номер витка, начиная с которого будут трассироваться витки. По умолчанию – с первого витка.
<последний виток> – номер витка, по который будут трассироваться витки. По умолчанию – по последний виток.
<шаг> – шаг, с которым будут трассироваться витки. По умолчанию полагается единице.
Примеры задания множества витков:
-
(0:2,10,) – трассировать витки со 2-ого по 10-ый.
-
(0:,10,) – трассировать витки по 10-ый включительно.
-
(0:4,,) – трассировать витки, начиная с 4-ого.
-
(0:,,3) – трассировать каждый 3-й виток.
При задании специального режима в файле параметров, информация о пустых витках (для которых никаких других записей в трассировку не пишется) не будет помещаться в файл трассировки.
6.4.2Файл трассировки
Файл трассировки создается на каждом процессоре и имеет текстовый формат. При накоплении трассировки в начало файла помещается специальный заголовок. Этот заголовок содержит параметры, которые использовались при накоплении трассировки. В режиме сравнения результатов вычислений, данный заголовок считывается из файла трассировки, и находящиеся в нем параметры используются вместо тех, которые заданы в конфигурационном файле.
Формат заголовка идентичен формату конфигурационного файла и имеет следующий вид:















