46725 (588437), страница 5

Файл №588437 46725 (Автоматическое распараллеливание программ для распределенных систем. Статическое построение расширенного графа управления) 5 страница46725 (588437) страница 52016-07-29СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 5)

int operator != (cArrayRefSg&)

10) Класс cVarListElemSg – представляет элемент списка обращений к переменным и массивам.

cVarListElemSg (SgVarRefExp*, cSymbolTabSg*), cVarListElemSg (SgArrayRefExp*, cSymbolTabSg*) – конструкторы класса, 1-й для разбора обращения к переменной, параметрами являются ссылка на переменную, представленная объектом Sage++, и таблица символов, в которую будут добавлены идентификаторы; 2-й для разбора ссылки на массив, параметры имеют тот же смысл.

int Variant () – тэг вида элемента (ссылка на переменную или на массив).

cSymbolSg *poSym – идентификатор переменной для ссылки 1-го вида.

cArrayRefSg *poArr – ссылка на массив для 2-го вида.

long int ExportData (ofstream&) – экспорт в файловый поток.

int operator == (cVarListElemSg&)

int operator != (cVarListElemSg&).

Для каждого из описанных классов существует его аналог во втором наборе, имеющий такое же имя за исключением постфикса “Sg”. В классах-аналогах отсутствуют методы для построения структур и конструкторы разбора. Корректная инициализация объектов этих классов производится только за счет введенных методов импорта из файлового потока. В классе cProgramGraphNode добавлены члены-данные для хранения директив FortranDVM, формирование которых осуществляет блок распределения вычислений и данных, и методы для их вставки, а также реализован экспорт этих комментариев в файл.

    1. 3.3 Алгоритмы

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

На самом внешнем уровне программы построения и экспорта всех структур находится функция main(). Ее основное содержание заключается в следующих строках:

cSourceProgramSg TestProg(projfile);

TestProg.PrepareAll();

TestProg.BuildAll();

TestProg.PrintAll(cout);

TestProg.ExportData(trgfile);

В первую очередь создается объект класса cSourceProgramSg, параметром конструктора которого является имя файла-проекта Sage++. Далее вызываются методы этого класса:

PrepareAll() – предварительная обработка Sage++ представления исходного приложения;

BuildAll() – построение всех структур;

PrintAll(cout) – вывод в поток cout построенных структур для просмотра;

ExportData(trgfile) – экспорт данных в файлы.

void cSourceProgramSg::PrepareAll()

Вызывает методы того же класса:

PrepareConsts(); - подготовка констант.

PrepareLoops(); - подготовка циклов.

void cSourceProgramSg::PrepareConsts()

Осуществляет замену обращений к константам их значениями. Алгоритм:

  • Просмотр таблицы имен Sage++ и составление списка объявленных констант и их значений.

  • Обход всех операторов программы и поиск во входящих в них выражениях использования каждой из констант.

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

При таком алгоритме, например, выражение 2*N+M+t, где N=100, M=5, будет заменено выражением 205+t.

void cSourceProgramSg::PrepareLoops().

Приводит все циклы программы к виду DO-ENDDO. Просматривает операторы программы. Для найденных циклов применяет метод Sage++, выполняющий такое преобразование.

void cSourceProgram::BuildAll().

BuildLoopList(); - построение списка циклов.

BuildProgGraph(); - построение графа.

void cSourceProgram::BuildLoopList().

LpList()->Build(FirstSt(), LastSt(), 0); - построение списка циклов.

LpList()->Analyse(); - анализ построенного списка.

void cLoopListSg::Build(SgStatement *first_line, SgStatement *last_line, int cur_lev).

Этот метод производит последовательный просмотр операторов в промежутке от first_line до last_line включительно с обеих сторон. При обнаружении оператора-заголовка цикла, осуществляется добавление к списку циклов нового элемента, в качестве его уровня вложенности принимается значение cur_lev. Затем метод вызывает себя со следующими параметрами: следующий оператор после обнаруженного заголовка цикла – first_line, оператор завершения найденного цикла – last_line, cur_lev+1 – для cur_lev в новом вызове. После возвращения из рекурсивного вызова просмотр продолжается с оператора завершения найденного цикла. Метод добавления нового элемента к списку цикла устроен так, что текущий указатель списка перемещается на вновь добавленный.

void cLoopListSg::Analyse().

Для каждого элемента списка:

AnalyseHead(SymTab()); - анализ заголовка.

AnalyseBodyVars(SymTab()); - анализ обращений к переменным и массивам в теле.

AnalyseRedVars(SymTab()); - поиск редукционных переменных.

AnalyseIoOp(); - поиск операторов ввода\вывода.

AnalyseGotoOp(); - анализ операторов перехода.

void cLoopListSg::AnalyseRedVars(cSymbolTabSg*).

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

перем = {перем} {операция} {выражение}, или (1)

перем =min/max({выражение} {перем}), или (2)

IF ({перем}{.GT.|.LT.}{выражение})

{перем}={выражение} (3)

{операция}="+"|"*" (4)

где {выражение} не содержит {перем}, а также {перем} нигде больше не используется в данном цикле. Условие (3) есть другая реализация условия (2). Также необходимо обнаруживать редукционные переменные в выражениях вида:

{перем}={выражение}{операция}{перем}{операция}{выражение} (5), где выполняются те же условия, что и в (1)-(4), но при этом {операция} стоящая по обе стороны {перем} одинакова и если {операция} ="+", то {выражения} не содержат операций умножения и деления.

void cSourceProgramSg::BuildProgGraph().

PrgGraph()->Build(FirstSt(), LastSt(), 0, sy_DIR_RIGHT1); - построение графа.

PrgGraph()->Analyse(); - анализ построенного графа.

void cProgramGraphSg::Analyse().

CountOpers();

void cProgramGraphSg::Build (SgStatement *first_line, SgStatement *last_line, int cur_lev, int cur_dir).

Для идентификации каждого из возможных направлений добавления новых элементов определены константы:

sy_DIR_RIGHT1, sy_DIR_RIGHT2, sy_DIR_DOWN

Добавление нового звена в некотором направлении осуществляется при помощи методов cProgramGraphSg::AddNewRight1 ();

cProgramGraphSg::AddNewRight2 ();

cProgramGraphSg::AddNewRightFull (); - специальное добавление для блока слияния;

cProgramGraphSg::AddNewDown ();

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

Поскольку в графе отсутствует заглавное звено, первый узел графа строится особым образом независимо от указанного направления.

Алгоритм работы метода (рекурсивный):

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

Запомнить номер текущего элемента графа в переменной node1.

Начать цикл прохода с first_line.

switch

Если текущий оператор – заголовок цикла

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

Если еще ничего не добавляли и cur_dir == sy_DIR_DOWN

Добавить вниз.

Иначе

Если ничего не добавляли и cur_dir == sy_DIR_RIGHT2

Добавить вправо2.

Иначе

Добавить вправо1.

{такой анализ связан с тем, что когда мы добавляем 1-е звено в данном вызове метода, мы должны учитывать переданное направление; в остальных случаях добавление блоков на одном уровне происходит вправо1}

Запомнить номер текущего (только что добавленного) элемента в node1.

Заполнить блок информацией.

{теперь надо добавить блок для найденного цикла}

Определить направление аналогично и добавить.

Заполнить блок информацией.

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

Вызвать рекурсивно Build с телом найденного цикла, cur_lev+1, sy_DIR_DOWN.

Установить указатель текущего оператора на конец цикла (ENDDO).

Если текущий оператор – заголовок ветвления

Проверка на необходимость добавления линейного блока – аналогично.

Добавить блок развилки в нужном направлении – аналогично.

Запомнить номер текущего блока (развилка) в переменной node2.

Заполнить блок информацией.

Добавить слияние.

Запомнить номер текущего блока (слияние) в переменной node3.

Вернуться влево (на развилку).

Вызвать Build с телом 1-й ветви, cur_lev, sy_DIR_RIGHT1.

Перейти на блок node2.

Вызвать Build с телом 2-й ветви, cur_lev, sy_DIR_RIGHT2.

Перейти на блок node3 (далее надо добавлять после слияния).

Установить указатель текущего оператора на конец ветвления (ENDIF).

Если текущий оператор – логический IF

Аналогично, только второй ветви нет.

Если текущий оператор – IF-ELSEIF

Аналогично, только ELSEIF обрабатывается как новый IF-THEN.

Конец switch

Если текущий оператор == last_line

Закончить цикл просмотра

Проверка на наличие линейного участка – аналогично.

Перейти на блок node1 (тот, на котором были перед вызовом).


Заключение

Реализованные в дипломной работе классы C++ выполняют следующие функции, соответствующие ее задачам:

  • построение расширенного графа потока управления программы, списка циклов и таблицы используемых идентификаторов;

  • экспорт этих структур в файлы;

  • предоставление блоку распределения вычислений и данных методов доступа к сохраненным структурам;

  • дополнение внутреннего представления программы директивами FortranDVM, сформированными блоком распределения вычислений и данных.

Общий объем разработанного программного кода – около 4500 строк на языке C++.

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

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


Библиография

  1. “Sage++ user’s guide (online)”, May 1995, Version 1.9

  2. “Designing and Building Parallel Programs (Online) v1.3”, © Copyright 1995 by Ian Foster

  3. “The Polaris Internal Representation.” Keith A. Faigin, Jay P. Hoeflinger, David A. Padua, Paul M. Petersen, and Stephen A. Weatherford. International Journal of Parallel Programming, October 1994.

  4. “The Structure of Parafrase-2: An Advanced Parallelizing Compiler for C and Fortran” Constantine Polychronopoulos, Milind B. Girkar, Mohammad R. Haghighat, Chia L. Lee, Bruce P.Leung, Dale A. Schouten. Languages and Compilers for Parallel Computing, MIT Press, 1990


Приложение

В качестве одной из тестовых программ использовалась реализация на языке Fortran77 алгоритма Якоби поиска решения системы линейных уравнений A x = b.

PROGRAM JACOB

PARAMETER (L=8, ITMAX=20)

REAL A(L,L), EPS, MAXEPS, B(L,L)

W = 0.5

MAXEPS = 0.5E - 7

DO 1 I = 1, L

DO 1 J = 1, L

A(I,J) = 0.

B(I,J) = (1. +I+J)*2.3

1 CONTINUE

DO 2 IT = 1, ITMAX

EPS = 0.

DO 21 I = 2, L-1

DO 21 J = 2, L-1

EPS = MAX (EPS, ABS(B(I,J)-A(I,J)))

A(I,J) = B(I,J)

21 CONTINUE

DO 22 I = 2, L-1

DO 22 J = 2, L-1

B(I,J) = (W/4)*(A(I-1,J)+A(I,J-1)+A(I+1,J)+A(I,J+1))+(1-W)*A(I,J)

22 CONTINUE

PRINT *, 'IT = ', IT, ' EPS = ', EPS

IF (EPS .LT. MAXEPS) THEN

GO TO 3

ENDIF

2 CONTINUE

3 OPEN (3, FILE='JACOBI.DAT', FORM='FORMATTED')

Характеристики

Список файлов ВКР

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7027
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее