2. Кларк Э.М., Грамберг О., Пелед Д. Верификация моделей программ: Model Checking. Пер. с англ./Под ред. Р. Смелянского. — М.:МЦНМО, 2002. — 416 с.: ил.
3. Ларкин Е.В., Сабо Ю.И. Сети Петри-Маркова и отказоустойчивость авионики. — Тула: Тул. гос. ун-т., 2004. — 208 с.
4. Ивутин А.Н., Дараган Е.И. Применение сетей Петри и метода построения графа информационных зависимостей для решения задач верификации и распараллеливания вычислений // Известия ТулГУ. Серия: Технические науки. Вып. 5. — Тула: Изд. ТулГУ, 2011.
E.I. Daragan
PARALLEL CALCULATIONS AND VERIFICATION OF PROGRAMS
The main features of the process of verification of program code, describes the main approaches to solving problems of verification. Held a brief overview of parallel computing tasks.
Key words: verification, software, Petri nets, parallel computing.
Получено 17.05.12
УДК 004.415.52
А.Н. Ивутин, канд. техн. наук, доц., (4872) 33-24-45, alexey.ivutin@g:mail.com (Россия, Тула, ТулГУ), Е.И. Дараган, асп., (4872) 35-01-24, [email protected] (Россия, Тула, ТулГУ)
ПОСТРОЕНИЕ СХЕМЫ РАСПАРАЛЛЕЛИВАНИЯ ПОСЛЕДОВАТЕЛЬНОГО АЛГОРИТМА ПРОГРАММЫ
Рассмотрена проблема уменьшения вычислительной сложности алгоритма на основе его распараллеливания является формальное установление контекстной зависимости операторов, сводящееся к анализу информационных связей. Также предлагается общая методика построения схемы распараллеливания алгоритма.
Ключевые слова: алгоритм, параллельные вычислительные системы, управляющий граф.
Основным направлением развития компьютеров является повышение их быстродействия. Причем традиционно это повышение для персональных компьютеров происходило экстенсивными методами. Однако с
101
достижением по сути физического предела роста тактовой частоты процессоров дальнейшее увеличение производительности возможно лишь за счет перехода к параллельным архитектурам: многоядерным, сетевым с различной конфигурацией и собственно параллельным ЭВМ (MIMD, SIMD, MISD). И если в области проектирования специализированных ЭВМ идеи параллелизма используются на практике более 50 лет, например, в компьютере CDC-6600 1964 года параллелизм в явном виде выражался в виде десяти независимых функциональных устройств, работавших одновременно, то для персональных компьютеров задача сокращения временной вычислительной сложности за счет параллелизма вышла на первые позиции относительно недавно.
Основные идеи параллельной обработки информации были высказаны более 50 лет назад академиком С.А. Лебедевым в выступлении на сессии Академии наук СССР, где уже тогда были высказаны идеи «параллельной работы нескольких машин» [1].
При этом на практике разработчики столкнулись с проблемой неоптимального использования аппаратных средств параллельных структур, когда на существующем программном обеспечении невозможно не только добиться пиковой производительности, но и даже приблизиться к ней, что связано с простоем процессоров, конфликтов при доступе к совместно используемым ресурсам и т.п.
Решение данной проблемы на уровне аппаратного обеспечения затруднительно, что приводит к необходимости рациональной организации программной обработки данных.
К настоящему времени существует и достаточно успешно функционирует ряд систем автоматического и полуавтоматического распараллеливания последовательных программ [2]. При этом программист зачастую должен явно описывать параллельные области, а также отслеживать участки, где необходима синхронизация всех параллельных потоков. Более того, чтобы получить максимально эффективную программу в ряде случаев требуется детальное представление о процедурах взаимодействия параллельных процессов, периодах и точках синхронизации. Для некоторых таких систем характерен конфликт вида «корректность-эффективность», когда для получения максимального быстродействия вопросы соблюдения корректности должен отслеживать пользователь.
Актуальность поставленной проблемы связана с жестким ограничением времени при решении задач определенного класса и не решенной к настоящему времени проблемой динамического задействования дополнительных вычислительных ресурсов в виде локальных сетей ЭВМ или использования многопроцессорных ЭВМ типа MIMD. В тоже время прямой перенос последовательных алгоритмов в параллельные системы не дает ожидаемого прироста быстродействия и не обеспечивает эффективного использования вычислительных ресурсов. Кроме того, хотя существуют
методы распараллеливания последовательных программ, ряд задач, к которым в основном относятся контекстно-зависимые, автоматической декомпозиции и распараллеливанию не поддаются.
Решением проблемы уменьшения вычислительной сложности алгоритма на основе его распараллеливания является формальное установление контекстной зависимости операторов, сводящееся к анализу информационных связей, выделению групп операций с отсутствующим взаимным влиянием, параллельное исполнение которых не нарушит корректности проведенных оптимизирующих реструктурирующих преобразований, а также установление временных характеристик выполнения этих групп операторов и преобразование управляющего графа в управляющую сеть.
Одним из этапов адаптации алгоритма последовательной программы является построение схемы параллельного исполнения ее структурных единиц. В общем случае под этим понимается детерминированный функциональный блок конкретно взятого языка программирования. Программа описывает некоторое семейство алгоритмов. Выбор конкретного алгоритма при ее реализации определяется тем, как срабатывают условные операторы. Состав и порядок выполнения остальных операторов строго задается самой программой. Если в программе отсутствуют условные операторы, то программа изначально характеризуется лишь одним вариантом исполнения алгоритма. В свою очередь, срабатывания условных операторов зависит исключительно от входных данных. В любой момент времени в однопроцессорной системе может обрабатываться лишь одна операция. В параллельных системах в каждый момент времени может выполняться целый комплекс операций, не зависящих друг от друга. Все множество операций следует разделить на две общие группы: операции-источники и операции-потребители [3].
Операция-потребитель аргументов (входных данных) не может начать выполнение ранее, чем осуществится выполнение всех операций- поставщиков данных. Это говорит о том, что внутри множества функциональных блоков алгоритма существует частичный порядок их следования. Рассмотрим методику построения графа параллельного выполнения на примере алгоритма, состоящего из ряда последовательных операций и операций условного перехода, граф которого показан рис 1.
Каждая вершина представленного графа является условным обозначением минимального функционального блока языка программирования (оператор, функция и т.п.). Для выполнения каждой необходимо соблюдение условия готовности входных аргументов (входных данных). Представленный граф алгоритма является ориентированным мультигра-фом. Также можно говорить и о его ацикличной природе, так как в программе, реализующий алгоритм, производятся только явные вычисления и отсутствуют величины, которые определяются через самих себя. Даже в случае, когда в коде программы имеются рекурсивные выражения, то это
лишь форма представления однотипных вычислений. При каждом обращении к рекурсии происходит вычисление разных операций над разными данными. В общем случае граф алгоритма есть мультиграф, т.е. две вершины могут быть связаны несколькими дугами. Это будет справедливо тогда, когда в качестве разных аргументов одной и той же операции используется одна и та же величина, функция - функциональный блок.
Задача построения схемы параллельного выполнения последовательного алгоритма сводится к решению нескольких подзадач:
1. Выявление логических зависимостей между вершинами графа. Для каждой из вершин производится поиск путей, ведущих в данную вершину. Важным условие построения путей является отсутствие циклических контуров в графе. В случае их наличия, создается дополнительная вершина. Данная вершина становится самостоятельной единицей, т.е. ее
наличие обуславливается присутствием в графе скрытых траекторий движения алгоритма.
В качестве примера можно привести наличие в алгоритме безусловных переходов (в том числе оператор goto). Такой подход дает возможность выявить все возможные пути к вершинам графа, а также позволяет получить полную схему выполнения алгоритма, учитывающую выполнение всех возможных вариантов условных и безусловных переходов.
Найдем часть путей в графе для вершины аб (Рис. 2).
2. Маркировка вершин графа исходного алгоритма. Допустим, что все операции выполняются за одно и тоже время. Пренебрежем всеми остальными временными потерями и будем считать, что операции начинают выполняться сразу, как только оказываются готовыми их аргументы. Предположим, что алгоритм начинает реализовываться в нулевой момент времени. Тогда каждой операции присваивается индекс, равный моменту времени окончания ее выполнения. Если индексы перенести на соответствующие вершины графа, то граф примет параллельную форму его представления. Номер яруса означает момент времени, когда заканчивают выполняться соответствующие ему операции. Операции одного яруса выполняются независимо друг от друга, а число операций совпадает с ши-
Рис. 2. Пример нахождения путей до вершины в графе алгоритма
105
3. Построение матрицы следования графа алгоритма. Для каждой из вершин искомого графа составляется список тех вершин, которые являются ее входами. Для удобства представления данных, предлагается использовать табличный вид представления. Таблица заполняется с учетом следующего: для каждой вершины графа вводится понятие яруса вершины, т.е. очередность выполнения функциональных блоков алгоритма. При заполнении матрицы вершины выстраиваются в порядке возрастания величины яруса. Аналогичные операции производятся и для строк матрицы. Заполнение матрицы производится построчно. В ячейку (д, ]) ставиться признак наличия зависимости по данным между ьой и у ой вершинами.
4. Построение информационно-логических цепочек связей вершин. Полученная первом этапе информация о логической структуре алгоритма, а также информация о зависимостях между функциональными блоками алгоритма по данным на втором этапе, используется при построении цепочек связей между вершинами графа. Для этого для каждой вершин выписываются, в порядке их следования, номера вершин, которые необходимо обойти, чтобы попасть в искомую вершину. При этом основным отличием данной операции, от производимых действия на первом этапе, является то, что в цепочку вершин попадаю и те, которые являются источником входных данных для текущей вершины, а также те, которые лишь косвенно влияют на выполнение алгоритма на данном шаге.
5. Используя полученную информацию, строиться схема выполнения алгоритма программы, учитывающая переход в искомую вершину лишь при условии обхода вершин, являющимися вершинами-источниками для текущей (рис. 3).
Рис. 3. Схема выполнения алгоритма программы
Построения схемы выполнения алгоритма для всех вершин графа, путем объединения повторяющихся вершин, предоставляет возможность получить полную карту исполнения алгоритма.
Одной из существенных характеристик параллельно выполняющихся частей кода является то, что между ними отсутствует зависимость по данным. Это позволяет говорить о том, что существует как минимум несколько вариантов параллельного исполнения программы. Выбор необходимой схемы обуславливает появление в методике неких оценок, являющихся критериями для выбора оптимального варианта распараллеливания вычислений. Получение адекватных оценок времени выполнения программ или их выделенных фрагментов важно для эффективного распараллеливания [5], планирования вычислительных процессов и распределения ресурсов масштабируемых систем, а также для оптимизации программ.
Довольно часто временные характеристики программы исследуются на инструментальной системе, а затем делается прогноз динамики программы на целевой вычислительной платформе. Как правило, инструментальные средства для такого рода анализа представляют собой сложные программные комплексы, позволяющие выявлять узкие места в работе пользовательских программ и добиваться ускорения их выполнения за счет оптимизации, в том числе и путем структурных преобразований программ. В процессе распараллеливания вычислений необходимо достижение максимального использования имеющихся ресурсов. При этом общее время выполнения исполняемого кода в параллельных обрабатывающих модулях необходимо минимизировать, учитывая возможности аппаратного обеспечения вычислительных ресурсов.
Схемы выполнения параллельных вычислений, полученные из последовательного алгоритма, в совокупности с требованиями и условиями эксплуатации алгоритма на вычислительной системе, позволяют получать близкие к оптимальным, для конкретной системы, временные и ресурсные характеристики рассматриваемого алгоритма.
Список литературы
1. Лебедев С.А. Электронно-вычислительные машины // Сессия АН СССР по научным проблемам автоматизации производства. Пленарные заседания. - М.: АН СССР. - 1957. - Т.1. - с. 162- 180.
2. Воеводин В.В. Компьютерная революция и вычислительная математика. // Математика и кибернетика. - М.: Знание.-1988. - Вып. 3.-47 с.
3. Воеводин В.В., Воеводин Вл. В. Паралельные вычисления. -СПб.: БХВ-Петербург, 2002. - 608 с.: ил. ISBN 5-94157-160-7
4. Барский А.Б. Паралллельные процессы в вычислительных системах: Планирование и организация. - Радио и связь, 1990. - 256 с.
5. Ивутин А.Н., Дараган Е.И. Применение сетей Петри и метода построения графа информационных зависимостей для решения задач верификации и распараллеливания вычислений. - Известия ТулГУ. Серия: Технические науки. Вып. 5, ч. 3. — Тула: Изд. ТулГУ, 2011. — С. 185-192.
A.N. Ivutin, E.I. Daragan
CONSTRUCTION OF PARALLELIZATION SEQUENTIAL ALGORITHM
The problem of reducing the computational complexity of the algorithm based on the parallelization is the formal establishment of the context dependence of the operators, which amounts to an analysis of information links. It is also proposed a general method of constructing the scheme of algorithm parallelization.
Key words: algorithm, parallel computing system, the control graph.
Получено 17.05.12