Описанные структуры образуют представление исходной последовательной программы достаточно высокого уровня абстракции, соответствующего проблематике рассматриваемой нами предметной области. Оно позволяет хранить всю необходимую для распределения вычислений и данных информацию о программе, сокращая при этом количество функциональных блоков до минимума.
Выполнение задач дипломной работы осуществлялось на языке C++ с использованием библиотеки Sage++ 2.0. В данном пункте приведены описания классов, составляющих программный код дипломной работы, использованные в их наиболее существенных методах алгоритмы, а также условия, которым должна удовлетворять входная программа для успешной ее обработки системой в целом, и реализованным в дипломной работе блоком в частности.
Первое требование к входной программе заключается в ее корректности с точки зрения синтаксиса и семантики Fortran77. Заключенные в ней ошибки, не определенные на этапе разбора текста средствами Sage++, могут привести к непредсказуемым результатам.
Общим для всей системы ограничением является также ее достаточно высокая чувствительность к плохой структурированности программы, а именно:
в программе не должны присутствовать операторы прекращения выполнения;
запрещены операторы перехода, за исключением выхода из тела цикла на первый за концом цикла оператор по условию.
Другим существенным требованием является запрет на использование COMMON-областей.
Ограничения, накладываемые в данной дипломной работе:
выражения в заголовках циклов (начальное, конечное, шаг) могут быть только линейными относительно некоторой переменной, т.е. иметь вид C1*V+C0, где C1 и C0 - константы, V - переменная;
индексные выражения в обращениях к массивам должны удовлетворять тому же условию;
отсутствие аппарата поиска зависимостей по данным влечет необходимость вставки пользователем комментария “DEPENDENCE” в теле цикла, содержащего зависимость.
В рамках дипломной работы реализовано два набора классов:
Классы, выполняющие построение внутреннего представления, экспорт данных для блока распределения вычислений и данных, последующий импорт результатов работы этого блока и генерацию текста на FortranDVM.
Классы, используемые в блоке распределения вычислений и данных. Выполняют импорт внутреннего представления и воссоздают его структуру, а также производят экспорт результатов работы этого блока.
Рассмотрим назначение классов 1-го набора и их наиболее важные члены.
1) Класс cSourceProgramSg - представляет исходную последовательную программу. Обработка входной программы должна начинаться с создания объекта этого класса.
cSourceProgramSg (char *projfile) - конструктор класса, projfile - имя файла проекта Sage++; в этом конструкторе происходит открытие проекта, разбор входящего в него файла исходной программы, создание незаполненных графа, списка циклов и таблицы символов.
SgStatement *FirstSt () - 1-й оператор программы.
SgStatement *LastSt () - последний оператор программы.
cProgramGraphSg *PrgGraph () - граф программы.
cLoopListSg *LpList () - список циклов.
cSymbolTabSg *SymTab () - таблица символов.
void PrepareConsts () - замена в теле программы обращений к константам на их значения.
void PrepareLoops () - конвертация циклов программы к виду DO-ENDDO.
void BuildLoopList () - построение списка циклов.
void BuildProgGraph () - построение графа программы.
void PrintLoopList (ostream&) - вывод в поток списка циклов для просмотра.
void PrintProgGraph (ostream&) - вывод графа.
void PrintSymbolTab (ostream&) - вывод таблицы имен.
void ExportData (char*) - экспорт данных в файлы.
void ImportData (char*) - импорт данных из файлов;
void Unparse (char*) - генерация результирующего текста в файле, имя которого определяется параметром метода.
При экспорте данных в файлы образуются следующие файлы:
filename.gr - узлы графа;
filename.gri - индексный файл;
filename.lp - список циклов;
filename.st - таблица символов, где filename - параметр метода ExportData(char*).
2) Класс cProgramGraphSg - представляет расширенный граф программы.
cProgramGraphSg (cSymbolTabSg*, cLoopListSg*) - конструктор класса, создает пустой граф управления. Параметры - таблица символов и список циклов, на которые будет ссылаться граф.
cLoopListSg *LpList () - список циклов, используемый графом.
cSymbolTabSg *SymTab () - таблица имен, используемая графом.
cProgramGraphNodeSg *CurNode () - текущий узел.
int IsStart () - является ли текущий узел начальным.
int GoStart (), GoDown (), GoUp (), GoLeft1 (), GoLeft2 (),
GoRight1 (), GoRight2 (), GoId (long int) - переместить указатель на текущий узел соответственно на 1-й узел, вниз, вверх, влево по 1-й ссылке, влево по 2-й ссылке, вправо по 1-й ссылке, вправо по 2-й ссылке, на узел с заданным номером. Возвращает 1 при удачном переходе, 0 в противном случае..
void CountOpers () - подсчет числа операций для каждого узла графа.
void ExportData (ofstream&, ofstream&) - экспорт графа и индексной информации в потоки.
void ImportData (ifstream&) - импорт данных от блока распределения вычислений, подлежащих вставке в граф;
void Build (SgStatement*, SgStatement*, int, int) - построение графа.
void Unparse () - произвести вставку добавленных в граф данных во внутреннее представление Sage++;
3) Класс cProgramGraphNodeSg - представляет узел графа управления.
cProgramGraphNodeSg () - конструктор класса, создает новый узел.
SgStatement *poSt1, *poSt2, *poSt3 - принимают значения после построения графа.
Для линейного участка: poSt1 - 1-й оператор блока, poSt2 - последний оператор.
Для цикла: poSt1 - оператор заголовка цикла, poSt2 - оператор, завершающий цикл (ENDDO)
Для ветвления: poSt1 - IF, poSt2 - ELSE, poSt3 - ENDIF.
int Level - уровень вложенности, внешнему уровню соответствует 0.
int IsParal - признак возможности распараллеливания.
long int LoopId - для элементов типа “цикл” содержит номер соответствующего цикла из списка.
float Ver1, Ver2 - для элементов типа “ветвление” вероятность перехода соответственно по 1-й и 2-й ветви.
float Opers[df_OPERS_COUNT] - массив, в каждом элементе которого содержится количество соответствующих индексу элемента операций в блоке. Например, Opers[0] - число сложений, Opers[1] - вычитаний.
long int Id () - уникальный номер узла.
int NodeType () - тэг типа узла.
long int ExportData (ofstream&) - экспорт узла в файловый поток, возвращает количество записанных байт.
void ImportData (ifstream&) - импорт данных из файлового потока.
void Unparse () - произвести вставку добавленных в узел данных во внутреннее представление Sage++.
4) Класс cLoopListSg - представляет список циклов программы.
cLoopListSg (cSymbolTabSg*) - конструктор класса, создает пустой список циклов, параметр - таблица символов, на которую будет ссылаться список.
cSymbolTabSg *SymTab () - таблица символов, используемая списком.
cLoopListNodeSg *CurNode () - указатель на текущий элемент списка.
int GoStart (), GoEnd (), GoRight (), GoLeft (), GoId (long int) - переместить указатель на текущий узел соответственно на 1-й узел, последний узел, влево, вправо, на узел с заданным номером. Возвращает 1 при удачном переходе, 0 в противном случае.
void Analyse () - произвести необходимый анализ элементов списка.
void Build (SgStatement*, SgStatement*, int) - построить список.
void ExportData (ofstream&) - экспорт списка в файловый поток.
5) Класс cLoopListNodeSg - представляет элемент списка циклов.
cLoopListNodeSg () - конструктор класса, создает новый элемент.
long int Id () - номер элемента.
SgStatement *poSt1, *poSt2 - ссылки соответственно на оператор заголовка цикла и на оператор завершения цикла.
cSymbolSg *poCounterSym - ссылка на переменную-счетчик цикла.
cExpressionSg *poStartExpr, *poEndExpr, *poStepExpr - начальное, конечное выражения счетчика и выражение шага цикла.
long int IterNum - количество итераций цикла.
int Level - уровень вложенности.
int IoOp, GotoOp - флаги наличия в теле цикла операторов ввода\вывода и операторов перехода за тело цикла.
cVarListElemSg *LVar[df_MAX_LRVAR_COUNT], *RVar[df_MAX_LRVAR_COUNT] - списки обращений к переменным и элементам массивов на модификацию и на чтение соответственно.
Страницы: 1, 2, 3, 4, 5, 6, 7