debugDDr (1158410), страница 7
Текст из файла (страница 7)
MODE = <NONE | MINIMAL | MODIFY | FULL>, [EMPTYITER]
# Begin trace header. Don't modify these records
<SL | PL | TR> <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла>] {<имя файла>, <номер строки>} = <NONE | MINIMAL | MODIFY | FULL>, (<измерение>:<первый виток>, < последний виток>, <шаг >), …
EL: <номер конструкции>
…
<SL | PL | TR> <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла>] {<имя файла>, <номер строки>} = <NONE | MINIMAL | MODIFY | FULL>, (<измерение>:<первый виток>, < последний виток>, <шаг >), …
EL: <номер конструкции>
END_HEADER
# End trace header
Строка MODE определяет уровень подробности трассировки всей программы и режим накопления пустых витков. Все остальные строки определяют параметры для конкретных конструкций программы.
После заголовка, в файле трассировки идут записи следующих типов и форматов:
-
Чтение переменной:
RD: [<тип переменной>] <имя переменной> = <значение>; {<файл>, <строка>}
-
Начало оператора присваивания нового значения переменной:
BW: [<тип переменной>] <имя переменной>; {<файл>, <строка>}
-
Запись нового значения переменной:
AW: [<тип переменной>] < имя переменной > = <значение>; {<файл>, <строка>}
-
Чтение редукционной переменной:
RV_RD: [<тип переменной >] < имя переменной > = < значение >; {< файл>, <строка >}
-
Начало оператора присваивания нового значения редукционной переменной:
RV_BW: [<тип переменной >] < имя переменной >; {< файл>, <строка >}
-
Запись нового значения редукционной переменной:
RV_AW: [<тип переменной>] <имя переменной> = <значение>; {<файл>, <строка>}
-
Результат вычисления редукции:
RV: [<тип переменной >] <значение>; {< файл>, <строка >}
-
Завершение блока собственных вычислений в последовательной части программы:
SKP: {< файл>, <строка >}
-
Начало параллельного цикла:
PL: <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла>] ; {<файл>, <строка>}
-
Начало последовательного цикла:
SL: <номер конструкции> (<номер объемлющей конструкции>) [<ранг цикла (всегда равен единице)>] ; {<файл>, <строка>}
-
Начало области параллельных задач:
TR: <номер конструкции> (<номер объемлющей конструкции>) [<ранг области (всегда равен единице)>] ; {<файл>, <строка>}
-
Начало витка1 или параллельной задачи:
IT: <абсолютный индекс витка (вычисляется из значений всех индексных переменных цикла) или номер задачи>, (<значение индексной переменной1>,< значение индексной переменной2>,…).
-
Завершение параллельного или последовательного цикла или области задач:
EL: <номер конструкции>; {<файл>, <строка>}
6.5Реализация системы сравнения результатов выполнения
6.5.1Основные структуры системы сравнения результатов выполнения
Система сравнения результатов выполнения основана на сборе и последующем сравнении трассировки исполнения программы. Трассировка накапливается в памяти каждого процессора и записывается в файл при завершении выполнения программы. Она состоит из двух частей. Первая часть представляет собой описание исполняемых конструкций программы (параллельные и последовательные циклы, области задач) и содержит информацию о вложенности конструкций, параметры сбора трассировки для каждой конструкции и прочую информацию. Информация об исполняемых конструкциях программы и их параметрах считываются при запуске программы из конфигурационного файла трассировки. Если данный файл отсутствует (его имя при запуске не задано) или нарушена его структура, то описание конструкций программы формируется в ходе сбора трассировки. Заметим также, что в режиме сравнения результатов вычислений конфигурационный файл трассировки не читается, а все параметры берутся из файла с эталонной трассировкой.
Вторая часть трассировки представляет собой массив трассировочных записей. Во время накопления трассировки поддерживается согласованность трассировочных записей и структур, описывающих исполняемые конструкции программы. При записи в трассировку информации о начале конструкции, в ней запоминается указатель на соответствующую структуру, описывающую данную конструкцию. Если структура с описанием конструкции отсутствует, то она динамически создается.
Так как при сравнении результатов вычислений порядок выполнения витков параллельных циклов может отличаться, то каждая запись начала цикла содержит массив номеров всех записей витков данного цикла. В начале выполнения каждого витка этот массив просматривается для нахождения соответствующей записи в трассировке. Для ускорения поиска данный массив организован в виде хеш-таблицы.
Рис. 4. Структура трассировки
Система сравнения результатов выполнения содержит в себе следующие основные модули: модуль чтения трассировки, модуль записи трассировки, модуль накопления трассировки, модуль сравнения трассировки и модуль обработки операций редукции. К данным модулям обращаются в зависимости от параметров и режима выполнения динамического отладчика.
Функции накопления трассировки формируют соответствующие записи в таблице трассировочных записей. Если задан режим прямой записи в файл, то записи в памяти не формируются, а сразу же пишутся в файл с помощью функций модуля записи трассировки. Если задан режим сравнения трассировки, то функции накопления используются модулем чтения трассировки для формирования в памяти трассировки, соответствующей эталонному файлу.
Далее приводятся структуры, используемые системой сравнения результатов выполнения.
Структура описания исполняемой конструкции программы:
| typedef struct tag_STRUCT_INFO | ||||
| { | ||||
| long | No; | |||
| char | File[MaxSourceFile]; | |||
| unsigned long | Line; | |||
| enum_TraceLevel | TraceLevel; | |||
| enum_TraceLevel | RealLevel; | |||
| byte | bSkipExecution; | |||
| s_COLLECTION | cChildren; | |||
| byte | Type; | |||
| byte | Rank; | |||
| s_REGULARSET | Limit[MAXARRAYDIM]; | |||
| s_REGULARSET | Current[MAXARRAYDIM]; | |||
| s_REGULARSET | Common[MAXARRAYDIM]; | |||
| long | CurIter[MAXARRAYDIM]; | |||
| struct tag_ STRUCT _INFO* | pParent; | |||
| unsigned long | Bytes; | |||
| unsigned long | StrCount; | |||
| unsigned long | Iters; | |||
| } | STRUCT_INFO; | |||
| No | – | уникальный номер конструкции; | ||
| File | – | имя файла программы, где располагается данная конструкция; | ||
| Line | – | номер строки начала конструкции; | ||
| TraceLevel | – | уровень трассировки данной конструкции, заданный в конфигурационном файле трассировки (полный, только модификации, минимальный или отключен); | ||
| RealLevel | – | реальный уровень трассировки данной конструкции, вычисленный исходя из параметров конфигурационного файла трассировки и уровня трассировки объемлющей конструкции; | ||
| bSkipExecution | – | флаг, определяющий трассировку конструкции в зависимости от ограничений по трассируемым виткам; | ||
| cChildren | – | коллекция указателей на описания вложенных конструкций для данной конструкции; | ||
| Type | – | тип конструкции (параллельный или последовательный цикл, область задач); | ||
| Rank | – | размерность конструкции (определяет размерность параллельных циклов); | ||
| Limit | – | ограничения трассировки конструкции по виткам; | ||
| Current | – | текущие пределы итерационных переменных циклов; | ||
| Common | – | наиболее общие пределы итерационных переменных циклов; | ||
| CurIter | – | текущие значения итерационных переменных; | ||
| pParent | – | ссылка на описание объемлющей конструкции; | ||
| Bytes | – | размер полной трассировки конструкции; | ||
| StrCount | – | число строк полной трассировки конструкции; | ||
| Iters | – | общее число выполненных итераций данной конструкции. | ||
Следующие структуры описывают записи трассировки в зависимости от их типа.
Запись, отмечающая завершение блока собственных вычислений в последовательной ветви программы:
| typedef struct tag_SKIP | ||||
| { | ||||
| byte | RecordType; | |||
| char | File[MaxSourceFile]; | |||
| unsigned long | Line; | |||
| } | SKIP; | |||
| RecordType | – | тип записи; | ||
| File | – | имя файла исходной DVM-программы; | ||
| Line | – | номер строки в DVM-программе. | ||
Запись, описывающая начало исполняемой конструкции программы:
| typedef struct tag_STRUCT_BEGIN | ||||
| { | ||||
| byte | RecordType; | |||
| char | File[MaxSourceFile]; | |||
| unsigned long | Line; | |||
| long | Parent; | |||
| long | LastRec; | |||
| struct tag_STRUCT_INFO * | pCnfgInfo; | |||
| HASH_TABLE | hIters; | |||
| } | STRUCT_BEGIN; | |||
| RecordType | – | тип записи; | ||
| File | – | имя файла исходной DVM-программы; | ||
| Line | – | номер строки в DVM-программе; | ||
| Parent | – | номер записи начала объемлющей конструкции программы или номер записи витка, в котором данная конструкция выполняется; | ||
| LastRec | – | номер записи завершения данной конструкции; | ||
| pCnfgInfo | – | ссылка на описание конструкции; | ||
| hIters | – | хэш-таблица номеров записей витков конструкции. Служит для ускорения поиска записи начала конструкции. | ||
Запись, описывающая завершение конструкции:
| typedef struct tag_STRUCT_END | ||||
| { | ||||
| byte | RecordType; | |||
| char | File[MaxSourceFile]; | |||
| unsigned long | Line; | |||
| long | Parent; | |||
| struct tag_STRUCT_INFO* | pCnfgInfo; | |||
| } | STRUCT_END; | |||
| RecordType | – | тип записи; | ||
| File | – | имя файла исходной DVM-программы; | ||
| Line | – | номер строки в DVM-программе; | ||
| Parent | – | номер записи начала объемлющей конструкции программы или номер записи витка, в котором данная конструкция выполняется; | ||
| pCnfgInfo | – | ссылка на описание конструкции. | ||
Запись, описывающая начало витка цикла или задачи из области задач:
| typedef struct tag_ITERATION | ||||
| { | ||||
| byte | RecordType; | |||
| long | Index[MAXARRAYDIM]; | |||
| long | LI; | |||
| char | Checked; | |||
| long | Parent; | |||
| byte | Rank; | |||
| } | ITERATION; | |||
| RecordType | – | тип записи; | ||
| Index | – | значения итерационных переменных; | ||
| LI | – | абсолютный индекс витка или номер задачи; | ||
| Checked | – | равен 1, если данный виток (или задача) уже исполнялся. Служит для проверки повторного исполнения в режиме сравнения трассировки; | ||
| Parent | – | номер записи начала конструкции, к которой относится виток или задача; | ||
| Rank | – | размерность витка (равна размерности исполняемой конструкции). | ||
Запись, описывающая доступ к переменной на чтение или запись или результат вычисления редукции.
| typedef struct tag_VARIABLE | ||||
| { | ||||
| byte | RecordType; | |||
| long | vType; | |||
| char | Operand[MaxOperand]; | |||
| char | File[MaxSourceFile]; | |||
| unsigned long | Line; | |||
| byte | Reduct; | |||
| VALUE | val; | |||
| } | VARIABLE; | |||
| RecordType | – | тип записи; | ||
| vType | – | тип переменной. Система сравнения результатов выполнения обрабатывает только следующие четыре типа: int, long, float и double; | ||
| Operand | – | имя переменной; | ||
| File | – | имя файла исходной DVM-программы; | ||
| Line | – | номер строки в DVM-программе; | ||
| Reduct | – | 1, если обращение идет к редукционной переменной. Иначе – 0; | ||
| val | – | значение переменной. | ||
Для хранения трассировочных записей и некоторых глобальных параметров системы сравнения результатов выполнения, определена глобальная переменная Trace, которая описывается структурой типа TRACE:
| typedef struct tag_TRACE | ||||
| { | ||||
| TABLE | tTrace; | |||
| s_COLLECTION | cStructs; | |||
| TABLE | tBegStructs; | |||
| long | CurIter; | |||
| long | CurStruct; | |||
| long | CurTraceRecord; | |||
| long | CurPreWriteRecord; | |||
| byte | IterFlash; | |||
| byte | ReductExprType; | |||
| STRUCT_INFO* | pCurCnfgInfo; | |||
| int | ErrCode; | |||
| int | Level; | |||
| unsigned long | Bytes; | |||
| unsigned long | StrCount; | |||
| unsigned long | Iters; | |||
| FILE * | TrcFileHandle; | |||
| unsigned long | TraceRecordBase; | |||
| unsigned | FloatPrecision; | |||
| } | TRACE; | |||
| tTrace | – | таблица трассировочных записей; | ||
| cStructs | – | коллекция описаний конструкций программы, расположенных на внешнем уровне (не имеющих объемлющих конструкций); | ||
| tBegStructs | – | таблица номеров всех записей начала конструкций; | ||
| CurIter | – | номер записи текущего исполняемого витка или задачи; | ||
| CurStruct | – | номер записи текущей исполняемой конструкции; | ||
| CurTraceRecord | – | номер текущей обрабатываемой записи трассировки; | ||
| CurPreWriteRecord | – | номер записи начала текущего обрабатываемого выражения; | ||
| IterFlash | – | флаг отложенной записи витка; | ||
| ReductExprType | – | флаг обработки выражения, вычисляющего значение редукционной переменной; | ||
| pCurCnfgInfo | – | ссылка на описание текущей исполняемой конструкции; | ||
| ErrCode | – | код последней ошибки; | ||
| Level | – | уровень трассировки, заданный для всей программы; | ||
| Bytes | – | размер полной трассировки последовательной части программы; | ||
| StrCount | – | число строк трассировки последовательной части программы; | ||
| Iters | – | общее число всех выполненных витков программы. Используется для вычисления объема занимаемой памяти. | ||
| TrcFileHandle | – | дескриптор файла трассировки; | ||
| TraceRecordBase | – | номер строки в файле трассировки, начиная с которого идут непосредственно трассировочные записи. | ||
| FloatPrecision | – | число знаков после запятой, которые будут записываться в трассировку для вещественных чисел. Вычисляется исходя из параметров трассировки. | ||
Для работы с трассировкой предназначен следующий набор функций. Данные функции обращаются к функциям модулей чтения, записи, накопления и сравнения трассировки в зависимости от заданных параметров и текущего режима выполнения.
| void cmptrace_Init(void) |
Функция инициализирует структуры, используемые для трассировки. Если задан режим сравнения трассировки, то производит чтение файла с эталонной трассировкой. Если задан режим накопления трассировки, то производится чтение файла описания циклов.
| void cmptrace_ReInit(void) |
Функция подготавливает внутренние структуры к режиму сравнения трассировки после чтения файла с эталонной трассировкой.
| void cmptrace_Done(void) |
Функция деинициализирует внутренние структуры, используемые для трассировки. Производит освобождение всей занятой памяти и формирует файл трассировки и конфигурационный файл, если заданы соответствующие режимы.
| void cmptrace_Read(void) |
Функция производит чтение конфигурационного файла трассировки или файла с эталонной трассировкой в зависимости от заданного режима.
| void cmptrace_Write(void) |
Функция производит запись конфигурационного файла трассировки или файла с эталонной трассировкой в зависимости от заданного режима.















