
Лекция № 6
Выделение параллелизма.
Одним из ключевых требований является преобразование исходного графа в граф, в котором, при условии детерминированности, набор модулей, которые могут работать параллельно, максимален. Самый безопасный путь, чтобы избежать недетерминированности,- это расположить все модули последовательно, что неэффективно. Простейший путь получения максимальной эффективности - это сделать все модули параллельными, но это может вызвать недетерминированность. Оптимальным решением является схема с максимальным параллелизмом, который не вызывает недетерминированности. Алгоритмы воссоздания такого нового графа управления организованы следующим образом:
Шаг 1: Возьмите любые два модуля, скажем м1 и м2, из одного уровня дерева графа управления. Если существует путь, скажем из м1 в м2, в первоначальном графе управления, и одно из описанных ниже условий (а), (б), выполняется, то включите дугу их м1 в м2 в новый граф управления. Повторяйте рекурсивный процесс, пока все модули не будут рассмотрены:
а). Ни один из них не является модулем проверки и существует путь между м1 и м2 в графе данных; или оба м1 и м2 используют одну противообласть в графе данных;
б). Один из них, скажем м1, является модулем проверки и м1 находится в противообласти м2; или непроверяющий модуль Х является потомком м1, и существует путь между Х и м2 в графе данных; или непроверяющий модуль Х является потомком м1, и оба Х и м2 имеет неразделенную противообласть в графе данных; или модуль проверки Х является потомком м1 и м2 имеет Х в своей противообласти.
Шаг 2: Удалите все лишние дуги. Если существует дуга из модуля м1 в модуль м2, а также существует другой путь из м1 в м2, то говорят, что первоначальная дуга лишняя.
Шаг 3: Связать START со всеми изолированными и левыми висячими модулями. Затем связать END со всеми правыми висячими модулями.
Восходящее реструктурирование.
До сих пор мы рассматривали решения для пар графов, при котором графы сохраняли свои первоначальные иерархические взаимоотношения. Часто первоначальное разбиение, намеченное проектировщиком, может быть оптимизировано путем простого использования параллельности для обеспечения более высокой производительности в рамках существующей иерархии, поддерживая соответствие целям проекта. Однако, максимальный параллелизм каждой пары графов (то есть каждой подсистемы) не предполагает максимального параллелизма всей системы. Таким образом, необходимо иметь расширение всей модели, если она нуждается в оптимизации. До того, как расширить иерархию нам необходимо проверить, имеется ли несоответствие или рекурсия среди этих подсистем. Несоответствие может быть между аргументами, объявленными в заголовке графа, и аргументами, используемыми, когда имя графа появляется в качестве промежуточного модуля. Нам необходима другая древовидная структура, а именно, дерево системы на расширенном уровне. На рис. 6. приводится пример сложной системы и ее дерева.
C помощью дерева системы могут быть обнаружены взаимно рекурсивные графы, которые приводят к циклам в дереве. Чтобы избежать неоднозначности, необходимо помнить, что модули проверки отличается от промежуточных модулей. Модуль проверки может иметь набор подграфов, которые являются возможными и только один из его подграфов может выполняться в каждый момент времени. Промежуточный модуль может быть расширен произвольно. Различие между деревом системы и деревом модуля явное. Если модуль не может быть расширен дальше, он называется “нижним модулем”.
Рис. 6. Пример сложной системы: 6а - система; 6b - дерево системы.
Основное достоинство восходящего реструктурирования состоит из двух функций: комбинирование и повторного анализа. Комбинирование предназначено для преобразования глобальной системы или локальной совокупности путем связывания их потомков и перестановки промежуточных модулей. Результатом может оказаться настолько сложная структура, что проектировщик не разберется в новом проекте. Ключом к пониманию новой структуры является тот факт, что все области и противообласти не были изменены. Данный метод позволяет структурировать проект до необходимой степени. Это может быть сделано путем связывания блоков, за которыми следуют их потомки, но, не включая те, которые проектировщик не хочет реструктурировать, хотя они могут иметь своих собственных потомков.
Закончив комбинирование, результирующая иерархия графов закончится на наборе нижних или объявленными “нижними” модулей. Далее следует повторный анализ новой пары графов, снова использую критерий достижения максимально возможной параллельности. Пример, приводимый на рис.7, показывает результаты для системы на рис.6 после восходящей обработки. Можно видеть, что лучшей декомпозицией является разбиение всей системы на подсистемы таким образом, что одна из них имеет другую подсистему, которая имеет свою собственную внутреннюю структуру, а не первоначальную стратегию трех подсистем.
Рис.7. Новая* структура, полученная методом комбинирования.