Информационные технологии Вестник Нижегородского университета им. Н.И. Лобачевского, 2012, № 5 (2), с. 359-366
УДК 004.45
СТАТИЧЕСКИЙ АНАЛИЗ ПОСЛЕДОВАТЕЛЬНЫХ ПРОГРАММ В СИСТЕМЕ АВТОМАТИЗИРОВАННОГО РАСПАРАЛЛЕЛИВАНИЯ «САПФОР»*
© 2012 г. Н.А. Катаев
Московский госуниверситет им. М.В. Ломоносова, Институт прикладной математики им. М.В. Келдыша РАН, Москва
kataev_nik@mail. т
Поступила в редакцию 10.09.2012
Для использования последовательных языков программирования при создании параллельной программы необходимо наличие эффективных средств анализа. Описывается подсистема анализа, входящая в САПФОР. Представлены результаты решения задачи анализа скалярных приватных переменных. Приводится описание структуры подсистемы анализа, представлены разработанные алгоритмы анализа, используемые в подсистеме анализа. Корректность и эффективность предложенных алгоритмов проверена на ряде задач.
Ключевые слова: САПФОР, DVM, ОрепМР, анализ последовательных программ, зависимости по данным, приватные переменные, редукционные переменные.
Введение
Использование технологий параллельного программирования (MPI, DVM, OpenMP, CUDA, OpenCL) требует четкого понимания «информационной структуры» [1] разрабатываемой программы, то есть связи различных элементов программы между собой. Такими элементами чаще всего являются операции. В совокупности со связями между ними операции образуют различные графовые модели программы. Модели оказываются достаточно сложными, и изучение их без специализированных средств - тяжелая задача для разработчиков.
Когда параллельные программы создаются на основе ранее существовавших последовательных программ, сложность изучения информационной структуры усугубляется отсутствием разработчиков исходных кодов. Трудности возникают, когда задача по распараллеливанию решается сторонней организацией - становятся незаменимы автоматизированные средства распараллеливания программ, обращающиеся за помощью к программистам при крайней необходимости. Их неотъемлемой частью являются подсистемы анализа программ.
Анализ и преобразование программ в распараллеливающих системах может выполняться как в полностью автоматическом режиме, так и в режиме диалога с пользователем. Подсистема анализа программ, разрабатываемая в рамках
данного исследования, входит в состав системы «САПФОР» [2].
САПФОР
Система автоматизированного распараллеливания Фортран-программ (САПФОР) разрабатывается в Институте прикладной математики им. М.В. Келдыша РАН. Входным языком системы является Fortran, а результат распараллеливания представляет собой программу на языке Fortran OpenMP, Fortran DVM/OpenMP или Fortran DVMH [3, 4, 5]. Все эти языки являются расширением стандартного языка Fortran 95 директивами параллелизма. Высокий уровень выходного языка позволяет продемонстрировать пользователю результат распараллеливания в понятных для него терминах, директивы распараллеливания могут быть проигнорированы компиляторами, не поддерживающими соответствующий язык. Для данных языков существуют развитые средства отладки функциональности и эффективности.
Отличительной особенностью САПФОР является использование автоматически распараллеливающего компилятора [6], преобразующего потенциально параллельную программу в ее параллельную версию для заданной ЭВМ. Предварительный анализ программы может выполняться в полуавтоматическом режиме. Для уточнения свойств последовательной про-
Статья рекомендована к публикации программным комитетом Международной научной конференции «Параллельные вычислительные технологии 2012».
Рис. 1. Схема САПФОР
граммы, выявленных анализатором, используются диалоговая оболочка [7] или специальные аннотации в тексте программы. Наиболее сложный этап распараллеливания (получение параллельной версии программы) выполняется блоками преобразования последовательных программ (экспертами) полностью автоматически. Схема САПФОР показана на рис. 1.
Подсистемы анализа
В САПФОР одновременно используется несколько подсистем анализа (анализаторов), запуск каждого следующего анализатора уточняет результаты уже проведенного анализа.
Подсистемы анализа выполняют две основные функции. Во-первых, структура программы должна быть сохранена в соответствии с требованиями базы данных САПФОР. Во-вторых, в результате анализа должны быть выявлены свойства программы, влияющие на распараллеливание. Для всех циклов программы необходима информация следующего вида: зависимости по данным [8], регулярные зависимости по массивам [7], редукционные зависимости между витками цикла, приватные переменные, время последовательного выполнения цикла, возможность преобразования программ с целью устранения зависимостей и др.
Выделяется два типа анализаторов: динамические и статические.
Динамические анализаторы выполняют анализ программы в процессе ее выполнения на представительных данных. Использование динамического анализа позволяет оценить влия-
ние входных данных на выполнение программы, но динамический анализ не способен обеспечить эксперта информацией для всевозможных наборов входных данных.
Статические анализаторы работают по тексту программы.
В САПФОР существует 4 статических анализатора, способных обнаруживать различные типы свойств исследуемых программ. После выполнения анализа любым из 4 анализаторов может быть запущен эксперт для получения параллельной версии программы, при этом эффективность распараллеливания будет зависеть от полноты выполненного анализа.
Первый анализатор основывается на Sage++ [9] представлении программ. Основной его задачей является сохранение в базе данных структуры программы и выявление редукционных зависимостей без осуществления межпроцедурного анализа.
Следующий анализатор [10] применяется для программ, написанных на Fortran 77. Анализатор способен обнаруживать информационные зависимости. В ряде случаев используемый в анализаторе алгоритм может быть применен для межпроцедурного анализа. Данный анализатор способен определять условия возникновения зависимостей в программе.
Еще один анализатор [11] в качестве основного средства анализа использует универсальную библиотеку трансляции (УБТ) [12]. Анализ программ выполняется на основе внутреннего представления GIMPLE компилятора GCC. Поддержание данного анализатора в актуальном состоянии наталкивается на многочислен-
ные трудности [11], кроме того, УБТ является коммерческим продуктом, что усложняет возможность ее использования.
В статье будет рассмотрен последний из анализаторов. В отличие от остальных он работает по информации, содержащейся в базе данных САПФОР, и не обращается к исходному тексту программы. Таким образом, он потенциально не зависит от языка, на котором написана анализируемая программа. Для выполнения анализа программ, написанных на языках, отличных от Fortran, достаточно создать средство, сохраняющее структуру программы в терминах базы данных САПФОР. Разработку данного анализатора можно разбить на четыре этапа:
1. Создание подсистемы, выполняющей анализ приватных скалярных переменных с выполнением межпроцедурного анализа и учетом псевдонимов, появляющихся вследствие использования COMMON-блоков и модулей. Уточнение анализа редукционных переменных.
2. Создание подсистемы, оценивающей возможность преобразования программ с целью устранения их свойств, снижающих эффективность распараллеливания.
3. Интеграция второго из рассмотренных анализаторов в разрабатываемый анализатор с целью определения информационных и регулярных зависимостей.
4. Создание подсистемы, выполняющей анализ приватных массивов.
Структура анализатора
Анализатор образуют три части: классы, поддерживающие внутреннее представление; загрузчик (front end), осуществляющий построение внутреннего представления анализатора на основе входных данных (например, базы данных САПФОР); модули анализа, выполняющие различные виды анализа над внутренним представлением анализатора. Результатом работы анализатора является обновленная база данных САПФОР. Обновление базы данных
выполняется сразу в процессе анализа, чтобы снизить объем используемой анализатором памяти.
Внутреннее представление не зависит от языка входной программы и моделирует ее информационную структуру с помощью следующих графовых моделей: граф оператора или выражения, граф управления процедуры (подпрограммы или функции), дерево циклов процедуры, граф вызовов программы, граф используемой в программе памяти.
Граф оператора - ориентированный граф, вершинами которого являются операции, а дуги показывают направление потока информации между операциями. Выделяется множество входных вершин, которые описывают используемые в операторе данные (переменные или константы), и множество выходных вершин, которые описывают результат применения оператора.
Пример графа оператора из строки 8 программы на рис. 2 приведен на рис. 3.
Граф управления процедуры - ориентированный граф, вершинами которого являются базовые блоки [8], а дуги показывают направление потока управления в программе. Базовые блоки содержат операторы процедуры, каждый из которых представлен графом оператора. Выделяются начальный и конечный базовый блок, которые не содержат исполняемых операторов программы. Данные вспомогательные блоки используются модулями анализа.
Граф вызовов программы содержит информацию о точках вызовов процедур.
Граф используемой в программе памяти -ориентированный граф, вершинами которого являются участки памяти (СОММОК-блоки, переменные и др.), а дуги показывают пересечения между участками памяти. Для пересечений по памяти содержится информация об их границах. Пример графа памяти для программы на рис. 2 приведен на рис. 4.
В процессе анализа внутреннее представление модифицируется модулями анализа с целью
1. program Example 1. subroutine print( j)
2. parameter( n = 100) 2. integer j, k
3. external add 3. common /a/ k
4. integer i, j, add 4.
5. 5. print *, "Two last elements: j, k
6. i = n 6. end
7. do while ( i < n * n) 7.
8. j = add( i, n) 8. integer function add( x, y)
9. enddo 9. integer x, y, z
10. 10. common /a/ z
11. call print( j) 11.
12. end 12. add = x + y
13. 13. Z = X
14. x = add
15. end
Рис. 2. Программа, печатающая два последних элемента арифметической прогрессии
Рис. 3. Граф оператора у = add(/, п)
Рис. 4. Граф используемой в программе памяти
наиболее точного отражения свойств анализируемой программы. Модулями анализа выполняется следующая последовательность действий:
1. Упорядочивание процедур: построение последовательности обратного обхода глубинного остовного дерева графа вызовов [8]. Данное упорядочивание процедур используется на последующих шагах анализа.
2. Уточнение описания участков памяти, используемых в процедурах.
3. Определение возможного пересечения по памяти между формальными параметрами процедур и членами СОММОК-блоков и модулей.
4. Определение приватных переменных.
5. Уточнение редукционных переменных
необходимо, так как в базе данных, подаваемой на вход анализатору, сохранена информация о редукциях в программе, полученная без межпроцедурного анализа.
Без использования межпроцедурного анализа невозможно определить, к каким участкам памяти будет происходить обращение при вызове некоторой процедуры. Из базы данных, подаваемой на вход анализатора, в качестве описания вызова доступен только список фактических параметров, при этом неизвестно, используются они на запись или на чтение. Кроме того, вызов процедуры может иметь побочный эффект, являющийся следствием использования глобальных данных (СОММОК-блоков и модулей).
Анализ выполняется над вызываемой процедурой один раз, и полученные результаты используются для уточнения описания участков памяти, используемых во всех вызовах. Анализ выполняется в порядке, определенном на первом шаге. При отсутствии рекурсивных вызовов процедур в программе это гарантирует, что при уточнении памяти, используемой в анализируемой процедуре, все вызываемые из нее процедуры уже проанализированы. Результаты выполненного анализа отображаются в графе оператора, содержащего вызов.
Результат выполнения данного шага виден на рис. 3. В процессе анализа было установлено, что при вызове функции add в операторе из строки 8 программы на рис. 2 параметр n используется только на чтение, параметр i используется на чтение и на запись. Кроме того было установлено, что оператор использует на запись член COMMON-блока, явно не описанного в вызывающей процедуре. Данная информация повлекла за собой модификацию графа памяти. Обновленный граф памяти изображен на рис. 4.
При некоторых вызовах процедур фактические параметры могут пересекаться по памяти. Это порождает соответствующую связь между формальными параметрами, которая должна быть учтена при последующем анализе. Фактические параметры могут быть также связаны с элементами COMMON-блоков или модулей, используемых в вызываемой процедуре. Данная информация определяется на основе возможных значений формальных параметров. Под значениями понимаются те участки памяти из других программных единиц (ПЕ) или COMMON-бло-ков, которым могут соответствовать формальные параметры ПЕ при некотором потенциально возможном вызове. Найденные связи добавляются в граф памяти программы.
Анализ выполняется в порядке, противоположном порядку, определенному на первом шаге. Это гарантирует, что при анализе любой процедуры все вызывающие ее процедуры уже проанализированы, то есть известны все возможные значения формальных параметров вызывающих процедур. Это необходимо в случае, когда формальные параметры вызывающей процедуры являются фактическими для вызываемой процедуры.
Анализ приватных переменных
Пусть VarP, OperationP, LoopP - множества переменных, операций и циклов некоторой программы P соответственно, MUP - память, используемая в программе P.
Каждой переменной v е VarP соответствует некоторый участок памяти mu(v) е MUP. При этом могут существовать переменные v1, v2 е е Var, такие, что mu(v1) n mu(v2) ф 0. Такие переменные являются псевдонимами. К ним относятся указатели в C, члены COMMON-блоков, эквивалентности, члены модулей в Fortran. Псевдонимы могут возникнуть при передаче параметров по ссылке. Будем говорить, что операция S2 е OperationP достижима из операции S1 е OperationP, если поток управления после прохождения операции S1 достигает операции S2 . Отношение достижимости выполняется и в том случае, если операции S1 и S2 совпадают.
Рассмотрим множество итераций IterationL некоторого цикла L е LoopP. Введем на данном множестве отношение порядка в соответствии с порядком выполнения итераций в последовательной программе. Пронумеруем все итерации из данного множества и, говоря о некоторой итерации, будем иметь в виду ее номер. Тогда операцию S е OperationP, выполняющуюся в цикле L е LoopP, можно рассматривать как множество выполнений заданной операции на различных итерациях цикла: S = {S1: S1 е I л I е е IterationL }.
Переменная v е VarP является приватной (private) для цикла L е LoopP, если:
1. Между любыми операциями S/1, S22 е OperationP, выполняющимися на разных итерациях цикла L (I1, I2 е IterationL л I1 ф I2), использующими память mu(v) и такими, что S^2 достижима из S11, существует операция S12 е е I2, использующая mu(v) на запись, такая, что S12 достижима из S11, а S^2 достижима из S12 .
2. Между любыми операциями S1, S2 е Op-erationP, использующими память mu(v), такими, что S1 е L л S2 £ L и S2 достижима из S1, существует операция S £ L, использующая mu(v) на запись.
Если выполняется условие (1) и все операции S2 , для которых условие (2) не выполняется, читают одно и то же значение, записанное в участок памяти mu(v) на последней итерации цикла, то переменная v является приватной по выходу (last private). Если выполняется условие
(2) и все операции S2I2 , для которых условие (1) не выполняется, используют значение, записанное в участок памяти mu(v) перед входом в цикл, то переменная v является приватной по
входу (first private).
Задачей анализа приватных переменных является обнаружение приватных переменных, переменных приватных по входу и по выходу для каждого естественного цикла программы. Естественный цикл [8] имеет единственный входной узел, называемый заголовком цикла. Анализ выполняется над каждой из процедур, при этом процедуры рассматриваются в порядке, определенном на шаге 1 последовательности действий, выполняемых модулями анализа. При этом используются результаты шагов 2 и 3.
На первом этапе разработки анализатора решалась задача анализа скалярных приватных переменных. Анализ приватных по входу переменных не выполняется, так как условия, по которым происходят ветвления в программе, не содержатся в базе данных САПФОР.
Рассмотрим последовательность процедур P" = {Pj,P2,...,Pn}, такую, что VI = 1,n -1 существует вызов процедуры Pi+1 из процедуры P, и такую, что mu(P1) n mu(P2) n mu(Pn) Ф 0, где mu(P) - участок памяти, используемый в процедуре PI . Непустое пересечение возможно за счет передачи параметров по ссылке, обращения к глобальным данным.
Рассмотрим переменную v е VarP, описанную в Pn и такую, что участок памяти mu(v) используется всеми процедурами последовательности P1n. В этом случае для решения задачи анализа приватных переменных недостаточно проанализировать только процедуру Pn. Операция S2 из условия (2) приватности переменной, использующая память mu(v), может находиться в одной из процедур последовательности P1 , отличной от процедуры Pn.
Необходимо выполнить межпроцедурный анализ для всех последовательностей P1 , удовлетворяющих описанному выше условию, рассматривая процедуры в порядке, обратном направлению вызовов. Данный порядок достигается за счет обхода процедур в порядке, определенном на первом шаге и гарантирующем, что перед рассмотрением некоторой процедуры все процедуры, вызываемые из нее, уже рассмотрены.
Решение задачи анализа приватных переменных для некоторой процедуры начинается с анализа внутренней области данной процедуры и основано на анализе потока данных [8]. Каждый цикл процедуры рассматривается отдельно. Анализ состоит из трех частей:
1. Анализ достигающих определений [8]
определяет, в каких базовых блоках графа управления анализируемой процедуры может быть определена каждая переменная процедуры при достижении потоком управления каждого базового блока.
2. Анализ внутренней области цикла выполняется для проверки условия (1) из определения приватной переменной.
3. Анализ операций, внешних по отношению к циклу, выполняется для проверки условия (2) из определения приватных переменных.
При анализе внутренней области цикла анализируется подграф графа управления, вершинами которого являются базовые блоки, входящие в анализируемый цикл. Дуги графа управления, являющиеся для цикла обратными, входными и выходными, отбрасываются. Для каждого базового блока, входящего в подграф, определяется состояние переменных, используемых процедурой. Для этого выполняется анализ потока данных в прямом направлении в выделенном подграфе. Входным базовым блоком является заголовок цикла. Множество значений потока данных описывает состояния переменных в некотором базовом блоке:
1. Неопределенное состояние, означает, что анализ базового блока не проводился.
2. Переменная не использовалась в базовом блоке, и на любом пути, ведущем к данному блоку, переменная не использовалась или была инициализирована.
3. В базовом блоке или на некотором пути в графе управления, ведущем к данному блоку, переменная была использована, не будучи инициализированной.
4. Переменная была использована в базовом блоке на чтение, не будучи инициализированной, далее она была инициализирована в том же базовом блоке.
5. На выходе из базового блока переменная является инициализированной.
На основе информации о состоянии переменных, полученной в результате анализа потока данных в заданном подграфе, определяется множество переменных, являющихся кандидатами в приватные переменные, множество переменных, используемых в цикле только на чтение (при распараллеливании такие переменные могут быть объявлены как общие), множество неиспользуемых переменных в цикле.
На основе кандидатов в приватные переменные определяется множество кандидатов в переменные приватные по выходу. Данный анализ выполняется с использованием результатов анализа достигающих определений. Рассматриваются все базовые блоки процедуры, не вхо-
дящие в анализируемый цикл. Если для формальных параметров процедуры, элементов COMMON-блоков и модулей в конечном базовом блоке графа управления анализируемой процедуры доступны определения данных переменных, локализованные внутри анализируемого цикла, то данные переменные должны быть дополнительно проанализированы с использованием межпроцедурного анализа.
После того как были найдены кандидаты в переменные приватные по выходу, необходимо проверить выполнение следующих условий:
1. Из анализируемого цикла существует только один выход. В противном случае нельзя гарантировать выполнение условия (2) для приватных по выходу переменных. Следовательно, все кандидаты в приватные по выходу переменные помечаются как переменные, вызывающие зависимость.
2. При любом выполнении анализируемого цикла (независимо от состояния памяти программы) на последней итерации цикла данная переменная всегда получает одно и то же значение. Нарушение данного условия возможно в случае, если в цикле несколько обратных дуг. В этом случае перед выходом могут выполняться разные базовые блоки (при этом выход из цикла только один), в которых анализируемая переменная будет определена по-разному. Для такого анализа используется результат анализа достигающих определений.
Необходимый межпроцедурный анализ выполняется только в том случае, если данная проверка прошла успешно.
Для программы на рис. 2 проведенный анализ цикла с заголовком в строке 7 показал: переменная j и член COMMON-блока a являются приватными по выходу, переменная i не является приватной и вызывает зависимость, именованная константа n только читается.
Программная реализация
Анализатор реализован на языке программирования C++ с использованием библиотек STL (Standard Template Library) и BGL (Boost Graph Library). BGL является одной из библиотек, входящих в Boost. Использовались и другие библиотеки, входящие в Boost. Программа анализатора написана в объектно-ориентированном стиле с применением идей метапрограммирова-ния и включает следующие части, реализованные в виде библиотек:
• Библиотека, содержащая базовые структуры данных. В ней определены общие компоненты, не зависящие от анализатора и исполь-
зуемые остальными его частями. Например, здесь определено общее представление графов в анализаторе, построенное на основе BGL.
• Библиотека, содержащая структуры внутреннего представления анализатора.
• Библиотека, содержащая реализацию ввода/вывода. Данная библиотека предоставляет средства для доступа к базе данных САПФОР. На их основе в ней реализован front end анализатора, кроме того средства ввода/вывода используются для сохранения результатов анализа.
• Библиотека, содержащая модули анализа, является ядром анализа.
Все компоненты программы анализатора сопровождаются комментариями в формате, поддерживаемом средством автоматической генерации документации Doxygen. Программа анализатора насчитывает 12000 строк кода.
Экспериментальная проверка
Анализатор был проверен экспериментально на тесте Якоби, программах «Каверна» и «Контейнер» (ИПМ им. М.В. Келдыша РАН) и др. Корректность результатов анализа для теста Якоби была проверена с помощью диалоговой оболочки и экспертов САПФОР. Для остальных задач, в силу их объема, проверка корректности возможна только с использованием экспертов САПФОР. На основе результатов анализа, сохраненных в базе данных, были построены параллельные версии для программ Якоби, «Контейнер» и «Каверна».
Время работы анализатора на персональном компьютере с процессором Intel® Core™ 2 Duo T8300 с частотой 2.4 ГГц и 3 Гб оперативной памяти приведено в таблице.
Таблица
Время работы анализатора
Анализируемая Количество Время, затрачен-
программа строк ное на анализ, с
Якоби 40 < 1
Каверна 500 2
Контейнер 900 6
Приложение 1 3000 16
Приложение 2 19000 977 (16 минут)
Из детализации данных замеров времени, доступной в процессе анализа, видно, что основное время затрачено на анализ достигающих определений и поиск приватных переменных. Из этого следует, что деятельность по оптимизации работы анализатора должна быть сконцентрирована на этих двух стадиях анализа.
Заключение
Распараллеливание последовательных программ требует четкого понимания информационной структуры разрабатываемой программы. Для этого в рамках САПФОР было решено разработать статический анализатор. Разработка анализатора выполняется в четыре этапа.
В рамках первого этапа было разработано внутреннее представление, не зависящее от языка программирования, на котором написана анализируемая программа, и решена задача анализа приватных скалярных переменных. Написан front end для базы данных САПФОР, построенной на основе языка программирования Fortran 95. Анализатор проверен на программах, содержащих до 20 тысяч строк. Анализ был выполнен за приемлемое время. Его корректность была проверена с помощью диалоговой оболочки и экспертов САПФОР.
Работа поддержана ФЦП «Исследования и разработки по приоритетным направлениям развития научно-технологического комплекса России на 2007-2013 годы» ГК № 07.514.11.4030.
Список литературы
1. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: БХВ-Петербург, 2004. 608 с.
2. Система автоматизированной параллелизации Фортран-программ. URL: http://www.keldysh.ru/dvm/ SAPFOR/ (дата обращения: 02.04.2012).
3. Бахтин В.А., Коновалов Н.А., Крюков В.А., Поддерюгина Н.В. Fortran OpenMP/DVM - язык параллельного программирования для кластеров // Материалы Второго Международ. науч.-практич. семинара «Высокопроизводительные параллельные вычисления на кластерных системах», Н. Новгород, 26-29 ноября 2002 г. C. 28-30.
4. Бахтин В. А., Коновалов Н. А., Поддерюгина Н.В., Устюгов С.Д. Гибридный способ программиро-
вания DVM/OpenMP на SMP-кластерах // Труды Всерос. науч. конф. «Научный сервис в сети Интернет: технологии параллельного программирования», Новороссийск, сент. 2006 г. Изд-во МГУ. C. 128-130.
5. Бахтин В.А., Клинов М.С., Крюков В.А. и др. Расширение DVM-модели параллельного программирования для кластеров с гетерогенными узлами // Труды Международ. суперкомпьютерной конф. «Научный сервис в сети Интернет: экзафлопсное будущее», Новороссийск, 19-24 сент. 2011 г. М.: Изд-во МГУ. С. 310-315.
6. Крюков В.А., Клинов М.С., Бахтин В.А., Под-дерюгина Н. В. Автоматическое распараллеливание последовательных программ для многоядерных кластеров // Труды Международ. суперкомпьютерной конф. «Научный сервис в сети Интернет: суперкомпьютерные центры и задачи», Новороссийск, 20-25 сент. 2010 г. М.: Изд-во МГУ. С. 12-15.
7. Бахтин В.А., Бородич И.Г., Катаев Н.А. и др. Диалог с программистом в системе автоматизации распараллеливания САПФОР // Труды Международ. науч. конф. «Научный сервис в сети Интернет: эк-зафлопсное будущее», Новороссийск, 19-24 сент. 2011 г. М.: Изд-во МГУ, 2011. С. 67-70.
8. Ахо А.В., Лам М.С., Сети Р., Ульман Дж.Д. Компиляторы: принципы, технологии и инструментарий. 2-е изд.: Пер. с англ. М.: ООО «И. Д.Вильямс», 2008. 1184 с. Главы 9, 11.
9. pC++/Sage++ Home Page. URL: http://www. ex-treme.indiana.edu/sage/ (дата обращения 12.01.2012).
10. Катаев Н. А. Система автоматизированного распараллеливания Фортран-программ: анализ многомодульных программ // Сборник тезисов лучших дипломных работ 2009 года. М.: Издательский отдел факультета ВМиК МГУ им. М.В. Ломоносова, МАКС Пресс, 2009. С. 141-142.
11. Катаев Н. А. Анализ последовательных программ с помощью средств УБТ // Труды Международ. науч. конф. «Параллельные вычислительные технологии (ПаВТ'2011)», Москва, 28 марта - 1 апреля 2011 г. Челябинск: Издательский центр ЮУр-ГУ, 2011. С. 697.
12. Optimizing Technologies. URL: http:// http:// www.optimitech.com/ (дата обращения: 15.01.2012).
STATIC ANALYSIS OF SEQUENTIAL PROGRAMS IN THE AUTOMATIC PARALLELIZATION ENVIRONMENT SAPFOR
N.A. Kataev
Advanced analysis tools are essential for efficient parallel code implementation when using sequential programming languages. The article describes an analysis subsystem making part of the System for Automated Paral-lelization of FORtran Programs (SAPFOR) and presents the results of the solution of the analysis problem of scalar private variables. We present the description of the analysis subsystem structure and analysis algorithms. The correctness and efficiency of the developed algorithms have been checked when solving a number of problems.
Keywords: SAPFOR, DVM, OpenMP, analysis of sequential programs, data dependencies, private variables, reduction variables.