DVM отладчик - оглавление Часть 1 (1 - 4) Часть 2 (5 - 6.4) Часть 3 (6.5) Часть 4 (7)
дата документа: февраль. 2000 - дата последнего обновления 22.05.01 -

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 флаг, определяющий трассировку конструкции в зависимости от ограничений по трассируемым виткам;
children коллекция указателей на описания вложенных конструкций для данной конструкции;
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)

Функция производит запись конфигурационного файла трассировки или файла с эталонной трассировкой в зависимости от заданного режима.

Следующие функции обращаются к функциям модулей накопления или сравнения трассировки в зависимости от заданного режима:

void cmptrace_BeginSeqLoop( char *File, unsigned long Line, long No )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции.

Функция отмечает начало последовательного цикла программы.

void cmptrace_BeginParLoop( char *File, unsigned long Line, long No, byte Rank,
                                                    long *Init, long *Last, long *Step )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;
Rank размерность цикла;
Init массив начальных значений итерационных переменных;
Last массив конечных значений итерационных переменных;
Step массив значений шагов приращения итерационных переменных.

Функция отмечает начало параллельного цикла программы.

void cmptrace_BeginTaskRegion( char *File, unsigned long Line, long No )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;

Функция отмечает начало области задач программы.

void cmptrace_EndStruct( char *File, unsigned long Line, long No, unsigned long BegLine )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;
BegLine номер строки начала конструкции.

Функция отмечает завершение цикла или области задач.

void cmptrace_Iter( AddrType *index )
     
index массив указателей на итерационные переменные.

Функция отмечает начало новой итерации цикла или новой задачи.

void cmptrace_PreStoreVar( char *File, unsigned long Line, char *Operand, long Type, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Reduct флаг обращения к редукционной переменной.

Функция отмечает начало вычисления нового значения для переменной с именем Operand.

void cmptrace_PostStoreVar( char* File, unsigned long Line, char* Operand, long Type, void* Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

Функция отмечает завершение вычисления выражения и запись результата в переменную с именем Operand.

void cmptrace_LoadVar( char* File, unsigned long Line, char* Operand, long Type, void* Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес переменной;
Reduct обращение идет к редукционной переменной или нет.

Функция отмечает чтение значения переменной.

void cmptrace_ReductVar( char *File, unsigned long Line, long Type, void *Value, byte Wait )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес редукционной переменной;
Wait флаг отложенной записи результата. Равен 1, если результат редукции необходимо помещать в трассировку только после завершения текущей параллельной конструкции.

Функция отмечает завершение вычисления редукционной операции.

void cmptrace_SkipBlock( char *File, unsigned long Line )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;

Функция отмечает завершение блока собственных вычислений в последовательной ветви программы.

Следующие функции предназначены для работы со структурами описания исполняемых конструкций программы.

STRUCT_INFO* trc_InfoNew(STRUCT_INFO* pParent)
     
pParent указатель на описание объемлющей конструкции.

Функция выделяет память и инициализирует новую структуру с описанием исполняемой конструкции.

void trc_InfoDone(STRUCT_INFO* pInfo)
     
pInfo указатель на описание конструкции.

Функция-деструктор описания конструкции.

int trc_InfoCanTrace(STRUCT_INFO* pInfo, int nRecType)
     
pInfo указатель на описание текущей исполняемой конструкции;
nRecType тип записи трассировки.

Функция определяет необходимость трассировки записи указанного типа в соответствии с параметрами конструкции.

void trc_InfoSetup(STRUCT_INFO* pInfo, long *Init, long *Last, long *Step)
     
pInfo указатель на описание конструкции;
Init массив начальных значений итерационных переменных;
Last массив конечных значений итерационных переменных;
Step массив значений шагов приращения итерационных переменных.

Функция инициализирует структуру описания конструкции в момент начала ее исполнения.

STRUCT_INFO* trc_InfoFindForCurrentLevel(long No, byte Type, byte Rank,
char *File, unsigned long Line)
     
No уникальный номер конструкции;
Type тип конструкции (параллельный или последовательный цикл, область задач);
Rank размерность конструкции;
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе.

Функция осуществляет поиск на текущем уровне вложенности конструкций и возвращает как результат поиска описание конструкции с заданными параметрами. Если описание конструкции с заданными параметрами отсутствует, то инициализируется новая структура и возвращается как результат.

STRUCT_INFO* trc_InfoFindByNo(long No, s_COLLECTION *pColl)
     
No уникальный номер конструкции;
pColl коллекция описаний конструкций.

Функция рекурсивно перебирает все элементы коллекции и возвращает описание конструкций с указанным номером. Возвращает NULL, если описания конструкции с казанным номером не существует.

6.5.2 Модуль записи трассировки

Функции модуля записи трассировки предназначены для формирования файла трассировки и конфигурационного файла трассировки. Прототипы функций модуля следующие:

void trc_wrt_header( s_COLLECTION* pStructs, int Level, FILE *hf,
int nWriteInfo )
     
pStructs коллекция конструкций программы верхнего уровня;
Level степень вложенности конструкций;
hf дескриптор файла;
nWriteInfo флаг записи информационных комментариев.

Функция записывает в файл конфигурационные параметры трассировки для каждой конструкции программы. Дополнительно, если задан флаг записи информационных комментариев, то в файл пишутся специальные комментарии с суммарными значениями объемов трассировки для каждой конструкции. Функция рекурсивно обращается к себе со значением Level+1 и коллекцией конструкций следующего уровня каждого элемента из коллекции pStructs.

void trc_wrt_trace( FILE *hf )
     
hf дескриптор файла трассировки.

Функция формирует файл с эталонной трассировки.

size_t trc_wrt_beginstruct( FILE *hf, STRUCT_BEGIN *pStruct)
hf дескриптор файла;
pStruct ссылка на запись начала конструкции программы.

Функция записывает в файл запись начала конструкции программы. Возвращает число записанных байтов.

size_t trc_wrt_enstruct( FILE *hf, STRUCT_END* pStruct)
     
hf дескриптор файла;
pStruct ссылка на запись завершения конструкции программы.

Функция записывает в файл запись завершения конструкции программы. Возвращает число записанных байтов.

size_t trc_wrt_iter( FILE *hf, ITERATION *Iter )
     
hf дескриптор файла;
Iter ссылка на запись начала витка.

Функция записывает в файл запись начала нового витка цикла или задачи. Возвращает число записанных байтов.

size_t trc_wrt_readvar( FILE *hf, VARIABLE *Var )
     
hf дескриптор файла;
Var ссылка на запись обращения к переменной.

Функция записывает в файл запись обращения к переменной на чтение. Возвращает число записанных байтов.

size_t trc_wrt_prewritevar( FILE *hf, VARIABLE *Var )
hf дескриптор файла;
Var ссылка на запись обращения к переменной.

Функция записывает в файл запись начала вычисления значения переменной. Возвращает число записанных байтов.

size_t trc_wrt_postwritevar( FILE *hf, VARIABLE *Var )
     
hf дескриптор файла;
Var ссылка на запись обращения к переменной.

Функция записывает в файл запись завершения вычисления нового значения и модификации переменной. Возвращает число записанных байтов.

size_t trc_wrt_reductvar( FILE *hf, VARIABLE *Var )
     
hf дескриптор файла;
Var ссылка на запись результата редукции.

Функция записывает в файл запись результата вычисления редукционной операции. Возвращает число записанных байтов.

size_t trc_wrt_variable( FILE *hf, VARIABLE *Var, int iType )
     
hf дескриптор файла;
Var ссылка на запись обращения к переменной;
iType тип записи.

Общая функция записи в файл события обращения к переменной. Возвращает число записанных байтов.

size_t trc_wrt_skip( FILE *hf, SKIP *Skip )
     
hf дескриптор файла;
Skip ссылка на запись завершения блока собственных вычислений.

Функция записывает в файл запись завершения блока собственных вычислений в последовательной части программы. Возвращает число записанных байтов.

void trc_wrt_calctraceinfo(void)

Функция вычисляет суммарные размеры трассировки программы и всех исполняемых конструкций.

void trc_wrt_calcinfo(STRUCT_INFO* pInfo)
     
pInfo ссылка на описание конструкции программы.

Функция вычисляет суммарные размеры трассировки для указанной конструкции.

6.5.3 Модуль накопления трассировки

Функции модуля накопления трассировки формируют записи в таблице трассировочных записей. Если задан режим сквозной записи, то трассировочные записи в памяти не формируются, а сразу же записываются в файл с помощью функций модуля записи трассировки.

Если задан режим сравнения трассировки, то данные функции используются модулем чтения трассировки для формирования в памяти таблицы трассировочных записей, соответствующей эталонному файлу.

Прототипы функций модуля накопления трассировки следующие:

void trc_put_beginstruct( char *File, unsigned long Line, long No, byte Type,
byte Rank, long *Init, long *Last, long *Step )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;
Type тип конструкции (параллельный или последовательный цикл, область задач);
Rank размерность конструкции;
Init массив начальных значений итерационных переменных;
Last массив конечных значений итерационных переменных;
Step массив значений шагов приращения итерационных переменных.

Функция формирует запись начала исполняемой конструкции программы.

void trc_put_endstruct(char *File, unsigned long Line, long No,
unsigned long BegLine)
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;
BegLine номер строки начала конструкции.

Функция формирует запись завершения исполняемой конструкции программы.

void trc_put_iteration( AddrType *index )
     
index массив указателей на итерационные переменные.

Функция формирует запись начала нового витка цикла или новой задачи. Если не задан режим записи пустых витков, то запись реально будет помещена в трассировку только после начала вложенной конструкции или обращения к переменной внутри данного витка.

void trc_put_iteration_flash_par( byte Rank, long *Index, long LI )
     
Rank размерность витка;
Index массив значений итерационных переменных;
LI абсолютный индекс витка.

Функция формирует запись начала нового витка цикла или новой задачи с указанными параметрами.

void trc_put_iteration_flash(void)

Функция помещает в трассировку текущую отложенную запись начала витка. Вызывается из функций trc_put_beginloop() и trc_put_variable().

void trc_put_readvar( char *File, unsigned long Line, char *Operand, long Type, void *Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

Функция формирует запись обращения к переменной на чтение.

void trc_put_prewritevar( char *File, unsigned long Line, char *Operand, long Type, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Reduct флаг обращения к редукционной переменной.

Функция формирует запись начала вычисления значения переменной.

void trc_put_postwritevar( char *File, unsigned long Line, char *Operand, long Type, void *Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

Функция формирует запись завершения вычисления нового значения и модификации переменной.

void trc_put_reductvar( char *File, unsigned long Line, long Type, void *Value )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес редукционной переменной.

Функция формирует запись результата вычисления редукционной операции.

void trc_put_variable( char *File, unsigned long Line, char *Operand, byte iType, long Type, void *Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
iType тип записи;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

Общая функция формирования записи обращения к переменной.

void trc_put_skip( char *File, unsigned long Line )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе.

Функция формирует запись завершения блока собственных вычислений в последовательной части программы.

6.5.4 Модуль чтения трассировки

Функции модуля чтения трассировки предназначены для чтения и разбора файла с эталонной трассировки и конфигурационного файла. Для формирования записей в таблице трассировочных записей используются функции модуля накопления трассировки.

Прототипы функций чтения трассировки следующие:

void trc_rd_header( DVMFILE *hf, char* szFileName )
     
hf дескриптор файла;
szFileName имя читаемого файла (участвует в сообщениях об ошибках).

Функция читает из файла структуру и параметры трассировки исполняемых конструкций программы.

void trc_rd_trace( DVMFILE *hf, char* szFileName, unsigned long StrBase )
     
hf дескриптор файла;
szFileName имя читаемого файла (участвует в сообщениях об ошибках);
StrBase номер строки файла, с которой начинаются записи трассировки.

Функция читает файл с трассировкой и формирует в памяти таблицу трассировочных записей.

unsigned long trc_rd_gets( DVMFILE *hf )
     
hf дескриптор файла.

Функция читает следующую запись из файла. Возвращает число обработанных строк.

short trc_rd_search_key(char *str)
     
str строка с ключевым словом.

Функция возвращает код, соответствующий строке с ключевым словом, или –1, если ключевое слово не найдено.

char* trc_rd_split( char *Str, char *Format, … )
Str разбираемая строка;
Format синтаксис строки;
адреса переменных, принимающих разобранные параметры строки.

Функция производит разбор строки на параметры в соответствии с указанным синтаксисом.

В форматной строке Format могут использоваться следующие символы:

i – int
l – long
f – float
d – double

6.5.5 Модуль сравнения трассировки

Функции модуля сравнения трассировки сравнивают события программы с соответствующими записями эталонной трассировки.

Прототипы функций модуля сравнения трассировки следующие:

void trc_cmp_beginstruct( char *File, unsigned long Line, long No, byte Type,
byte Rank, long *Init, long *Last, long *Step )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;
Type тип конструкции (параллельный или последовательный цикл, область задач);
Rank размерность конструкции;
Init массив начальных значений итерационных переменных;
Last массив конечных значений итерационных переменных;
Step массив значений шагов приращения итерационных переменных.

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

void trc_cmp_endstruct(char *File, unsigned long Line, long No, unsigned long BegLine)
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
No уникальный номер конструкции;
BegLine номер строки начала конструкции.

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

void trc_cmp_iteration( AddrType *index )
     
index массив указателей на итерационные переменные.

Функция сравнивает событие начала нового витка цикла или новой задачи с соответствующей эталонной записью трассировки. Если при формировании эталонной трассировки не был задан режим записи пустых итераций, то реальное сравнение будет произведено только после начала вложенной конструкции или обращения к переменной внутри данного витка.

void trc_cmp_iteration_flash(void)

Функция сравнивает текущую отложенную запись начала витка цикла или задачи с эталонной записью трассировки. Вызывается из функций trc_cmp_beginloop() и trc_cmp_variable().

void trc_cmp_readvar(char *File, unsigned long Line, long Type, void *Value,
byte Reduct)
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

Функция сравнивает событие обращения к переменной на чтение с соответствующей эталонной записью трассировки.

void trc_cmp_prewritevar( char *File, unsigned long Line, long Type, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Reduct флаг обращения к редукционной переменной

Функция сравнивает событие начала вычисления значения переменной с соответствующей эталонной записью трассировки.

void trc_cmp_postwritevar( char *File, unsigned long Line, long Type, void *Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

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

void trc_cmp_reductvar( char *File, unsigned long Line, long Type, void *Value )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
Type тип переменной;
Value адрес редукционной переменной.

Функция сравнивает событие получения результата редукционной операции с соответствующей эталонной записью трассировки.

void trc_cmp_variable( char *File, unsigned long Line, enum_TraceType iType, long vType, void *Value, byte Reduct )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе;
Operand имя переменной;
iType тип записи;
Type тип переменной;
Value адрес переменной;
Reduct флаг обращения к редукционной переменной.

Общая функция сравнения события обращения к переменной с соответствующей эталонной записью трассировки.

void trc_cmp_skip( char *File, unsigned long Line )
     
File имя файла с исходной DVM-программой;
Line номер строки в DVM-программе.

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

long trc_cmp_forward(long CurTraceRecord, enum_TraceType iType)
     
CurTraceRecord номер текущей записи трассировки;
iType тип записи, до которого производится смещение.

Функция осуществляет поиск ближайшей записи с указанным типом, начиная с текущей записи. Возвращает номер найденной записи. Если между текущей записью и искомой встречаются записи с типом ‘начало конструкции’, ‘конец конструкции’ или ‘начало витка’ или запись с указанным типом отсутствует, то функция возвращает -1.

6.5.6 Модуль обработки редукции

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

typedef struct tag_REDUCT_INFO
{    
  char* Current;
  char* Initial;
  byte StartReduct;
  s_REDVAR* RVar;
} REDUCT_INFO;  
     
Current указатель на буфер, содержащий промежуточный результат редукционной операции;
Initial указатель на буфер, содержащий начальное значение редукционной переменной;
StartReduct флаг начала редукционной операции над переменной;
RVar указатель на RTL-структуру, описывающую редукционную переменную.

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

Следующие функции предназначены для работы с таблицей редукционных переменных и ручного вычисления редукции:

void trcreduct_Insert(s_REDVAR* RVar )
     
RVar указатель на RTL-структуру описания редукционной переменной.

Функция регистрирует редукционную переменную в таблице переменных. Вызывается при объявлении пользователем редукционной переменной.

REDUCT_INFO* trcreduct_Find( void* addr )
     
addr адрес переменной.

Функция возвращает описание редукционной переменной для указанного адреса. Возвращает NULL, если редукционная переменная с соответствующим адресом не зарегистрирована.

void trcreduct_Remove( s_REDVAR* RVar )
     
RVar указатель на RTL-структуру описания редукционной переменной.

Функция удаляет описание редукционной переменной из таблицы переменных. Вызывается при завершении вычисления редукционной операции.

int trcreduct_IsReduct( void *addr )
     
addr адрес переменной.

Функция возвращает значение, отличное от нуля, если редукционная переменная с указанным адресом зарегистрирована в таблице редукционных переменных. Иначе возвращает 0.

void trcreduct_VarDestructor( VarInfo *Var )
     
Var ссылка на описание переменной.

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

void trcreduct_StoreInitial(s_REDVAR* RVar)
     
Rvar указатель на RTL-структуру описания редукционной переменной.

Функция сохраняет текущее значение редукционной переменной как начальное значение для последующего его восстановления в режиме ручного просчета.

void trcreduct_Calculate(void)

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

void trcreduct_CalculateVar( VarInfo *Var )
     
Var ссылка на описание редукционной переменной.

Функция вычисляет промежуточный результат редукционной операции для указанной редукционной переменной. Вызывается из функции trcreduct_Calculate().

void trcreduct_Complete( void *addr, long Type )
     
addr адрес редукционной переменной;
Type тип редукционной переменной (константы rt_INT, rt_LONG, rt_FLOAT или rt_DOUBLE).

Функция помещает в трассировку результат вычисления редукции. Вызывается при завершении вычисления редукционной операции.

void trcreduct_CopyResult( s_COLLECTION *RedVars )
     
RedVars коллекция редукционных переменных, вычисляемых в текущей параллельной конструкции.

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

6.5.7 Параметры системы сравнения результатов выполнения

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

EnableTrace – обработка трассировки выполняется, если параметр больше 0, и не выполняется при значении 0.

ManualReductCalc – режим вычисления редукции. Используется обычный режим, если параметр равен 0, и используется режим ручного просчета редукции, если параметр больше 0.

TraceOptions.FileLoopInfo – имя конфигурационного файла трассировки. Берется из каталога, заданного в параметре TraceOptions.TracePath. Используется только в режиме накопления трассировки.

TraceOptions.TraceFile имя файла с эталонной трассировкой. Файл берется из директории, указанной в TraceOptions.TracePath. Используется только в режиме сравнения трассировок.

TraceOptions.ErrorFile – имя файла для диагностических сообщений. В данный файл помещаются сообщения об ошибках, если значение параметра TraceOptions.ErrorToScreen равно 0. Если попытки открытия файла окажутся неуспешными, то диагностика будет выводиться на экран.

TraceOptions.Ext – расширения для файлов с накапливаемой трассировкой. Имя файла формируется по правилу: <номер процессора>.<значение TraceOptions.Ext>. Файл с трассировкой создается в каталоге, указанном в TraceOptions.TracePath. Используется только в режиме накопления трассировки.

TraceOptions.Exp – точность сравнения вещественных чисел в режиме сравнения трассировок.

TraceOptions.WrtHeaderProc – номер процессора, который будет создавать конфигурационный файл трассировки. Так как общая структура программы идентична для всех процессоров, то конфигурационный файл трассировки будет одинаков для любого процесса. Отличаться они будут только значениями объема трассировки, т.к. эти значения вычисляются только для текущего процесса. Общий объем трассировки для всех процессов можно получить, запустив программу на одном процессе.

TraceOptions.TracePath – путь, где формируются и располагаются файлы системы сравнения результатов выполнения.

TraceOptions.TraceMode – режим системы сравнения результатов выполнения. Возможны следующие значения:

0 генерация конфигурационного файла трассировки. Файл формирует только процессор с номером TraceOptions.WrtHeaderProc;
1 накопление трассировки и запись в файл <номер процессора>.<TraceOptions.Ext>;
2 объединение двух предыдущих режимов;
3 сравнение трассировки с эталонной, заданной в файле TraceOptions.TraceFile.

TraceOptions.TraceLevel – степень подробности трассировки по умолчанию. Используется только в режиме сбора трассировки. Возможны следующие значения:

0 отсутствие трассировки (уровень NONE);
1 трассировка начала и завершения циклов или областей задач и начала витков или задач (уровень MINIMAL);
2 предыдущий уровень, плюс трассировка модификаций переменных и результатов вычисления редукции (уровень MODIFY);
3 трассировка всех событий (уровень FULL).

TraceOptions.SpaceIndent – размер отступа, используемый в файлах трассировки.

TraceOptions.ErrorToScreen – если значение не равно 0, то вся диагностика выводится на экран.

TraceOptions.TableTraceSize – размер приращения таблицы трассировочных записей.

TraceOptions.HashIterIndex и TraceOptions.HashIterSize – параметры хеш-таблиц, используемых для поиска итераций.

TraceOptions.ReductHashIndexSize, TraceOptions.ReductHashTableSize и TraceOptions.ReductVarTableSize – параметры таблицы переменных, используемой для хранения редукционных переменных

TraceOptions.SaveThroughExec – если значение не равно 0, то трассировочные записи записываются в файл в ходе выполнения программы (в память накопление не происходит). В противном случае трассировка записывается по окончании выполнения программы.

TraceOptions.PrintStatistic – вывод статистики по трассировке после завершения программы. Статистика выводится в файл TraceOptions.ErrorFile или на экран в зависимости от значения параметра DebugOptions.ErrorToScreen.

TraceOptions.WriteEmptyIter – если значение не равно 0, то из трассировки исключаются записи, соответствующие началу витка и задачи, если внутри витков и задач нет обращений к переменным или вложенных конструкций.

TraceOptions.AppendErrorFile – определяет режим записи в файл диагностики при его использовании. Если значение равно 0, то предыдущее содержимое стирается при каждом запуске программы.

TraceOptions.MaxErrors – максимальное число ошибок, после которого будет отключено накопление или сравнение трассировки.

DVM отладчик - оглавление Часть 1 (1 - 4) Часть 2 (5 - 6.4) Часть 3 (6.5) Часть 4 (7)