Россия, Москва |
Программирование задач для асинхронной ВС архитектуры "data flow"
Непрерываемые участки программы
Наибольшая эффективность в работе ПВС может быть достигнута при значительном опережении процессом коммутации процесса вычислений, благодаря чему динамически обеспечивается достаточная загрузка вычислителей решающего поля. Поэтому желательно, чтобы программа коммутации, по возможности, состояла из крупных частей — непрерываемых (не содержащих команд условного перехода) участков, анализируемых транслятором как единое целое. Тогда транслятор, в основе которого лежит отображение ярусно-параллельной формы алгоритма, может более эффективно раскрыть и отразить в программе возможности распараллеливания — за счет "близкого" расположения в тексте программы тех команд, которые порождают параллельно выполняющиеся инструкции. Крайним случаем является просмотр транслятором во время каждого прохода всего текста программы на алгоритмическом языке. Однако структура программы должна остаться "прозрачной".
Как показывает анализ прикладных программ, один оператор присваивания редко содержит более десяти переменных в правой части. С другой стороны, несколько подряд расположенных операторов присваивания, содержащих в общей сложности несколько десятков переменных, ситуация, которая встречается достаточно часто. Поэтому желательно иметь возможность именно такую последовательность операторов присваивания считать непрерываемым участком программы.
Рассмотрим фрагмент программы:
R := a x b + c x d; P := R + d x p; R := m x n.
При этом не обязательно соблюдается правило единственного присваивания.
Запишем соответствующие этим операторам бесскобочные записи в одну строку:
Rab x cd x + := PRdp x + := Rmn x :=. (11.5)
Пусть транслятор анализирует ее как единое целое. Тогда для сохранения информационной зависимости между операторами необходимо следовать следующим правилам:
- В процессе каждого прохода записи отмечаются в порядке следования первая и все последующие переменные, стоящие правее знака присваивания ":=" (которым будет производиться присваивание), и отдельно все встречающиеся операнды. Если NE — операнд, то анализируется, не совпадает ли он с какой-либо ранее отмеченной переменной, которой производится присваивание, кроме отмеченной последней. Если совпадает, то N := N+1. Производится дальнейший анализ NE — переход к п. 2 изложенного выше алгоритма.
- Если NE — переменная, которой производится присваивание (она находится правее знака ":="), то наряду с отметкой ее в списке подобных переменных проверяется, не совпадает ли она с какой-либо ранее отмеченной переменной, которой производится присваивание, или с любым операндом, входящим в запись левее NE. Если совпадает, то N := N+1. Далее по алгоритму трансляции, изложенному выше.
Эти два правила, которым следует работа процессора памяти, позволяют сохранить алгоритмически предусмотренный порядок присваивания нового значения переменным, согласованный с порядком использования значений одной и той же переменной. А именно, в программе коммутации команда, использующая результат другой команды, следует обязательно за ней, а команда, изменяющая значение некоторой переменной, следует обязательно за командами, использующими прежнее значение этой переменной или даже изменяющими его ранее.
В алгоритм трансляции необходимо внести еще одно изменение.
Если двуместная операция соответствует присваиванию, то после формирования команды пересылки или третьего адреса ранее сформированной команды (при одновременном анализе нескольких операторов может быть выгоднее сформировать лишнюю команду пересылки, чем разыскивать ту команду, в которой надо изменить адрес вычислителя-исполнителя на адрес записи результата) операнды и знак операции присваивания удаляются из бесскобочной записи, как и прежде, но на их место ничего не подставляется.
Программа коммутации представлена на рис. 11.8.
После формирования команд бесскобочная запись (11.5) примет видL
.
Первое вхождение в эту запись операнда R в качестве переменной, которой присваивается значение, блокирует формирование последующих команд, использующих этот же операнд. Поэтому при втором проходе формируется только команда 4, в которой первоначально по третьему адресу указан адрес вычислителя-исполнителя . Бесскобочная запись принимает вид
.
Во время третьего прохода уточняется команда 4 подстановкой по адресу результата адреса переменной R. Первые три символа из записи исключаются. Тогда открывается возможность сформировать команду 5, использующую новое значение R. При этом вместо комбинации символов формируется адрес вычислителя . Поскольку слева все вхождения R исключены, формируется команда 6 присваивания нового значения R.
При четвертом проходе формируется команда 7.