Ресинхронизация схемы: инкрементный подход
Ключевые слова и синонимы
Ресинхронизация с достижением минимальной длительности
Постановка задачи
Ресинхронизация схемы является одной из самых эффективных техник структурной оптимизации для последовательных схем. Она перемещает регистры внутри схемы, не меняя ее функции. Задача ресинхронизации с достижением минимальной длительности стремится минимизировать самую долгую задержку между любыми двумя последовательными регистрами, которая определяет длительность такта.
Формальное определение задачи выглядит следующим образом. Пусть дан ориентированный граф [math]\displaystyle{ G = (V, E) \; }[/math], представляющий схему (в котором каждая вершина [math]\displaystyle{ v \in V \; }[/math] представляет вентиль, а каждое ребро [math]\displaystyle{ e \in E \; }[/math] – передачу сигнала от одного вентиля к другому) с задержками вентилей [math]\displaystyle{ d: V \to \mathbb{R}^+ \; }[/math] и количествами регистров [math]\displaystyle{ w: E \to \mathbb{N} \; }[/math]. Целью задачи ресинхронизации с нахождением минимальной длительности такта является перемещение регистров [math]\displaystyle{ w': E \to \mathbb{N} \; }[/math], такое, что максимальная задержка между любыми двумя последовательными регистрами оказывается минимальной.
Нотация
Чтобы гарантировать, что новые регистры – это перемещенные старые, метка [math]\displaystyle{ r: V \to \mathbb{Z} \; }[/math] используется для обозначения того, сколько регистров перемещены из исходящих ребер каждой вершины на входящие. Используя эту нотацию, можно вычислить новое количество регистров ребра (u, v) по формуле
[math]\displaystyle{ w'[u, v] = w[u, v] + r[v] - r[u] \; }[/math].
Кроме того, чтобы избежать явного перечисления путей при поиске самого длинного пути, еще одна метка [math]\displaystyle{ t: V \to \mathbb{R}^+ \; }[/math] будет представлять выходное время прибытия каждого вентиля – иначе говоря, максимальную задержку вентиля при переходе из любого предшествующего регистра. Для того чтобы t было не меньше комбинационной задержки, должно выполняться условие
[math]\displaystyle{ \forall (u, v) \in E: w'[u, v] = 0 \Rightarrow t[v] \ge t[u] + d[v] \; }[/math].
Ограничения и цель
В данной нотации допустимая ресинхронизация r не должна иметь отрицательного количества регистров по какому-либо ребру. Подобное условие допустимости задается формулой
[math]\displaystyle{ P0(r) \triangleq \forall (u, v) \in E: w[u, v] + r[v] - r[u] \ge 0 \; }[/math].
Как уже было установлено, условия, согласно которым t является допустимым временем прибытия, задаются следующими двумя предикатами.
[math]\displaystyle{ P1(t) \triangleq \forall v \in V: t[v] \ge d[v] \; }[/math],
[math]\displaystyle{ P2(r, t) \triangleq \forall u, v \in E: r[u] - r[v] = w[u, v] \implies t[v] - t[u] \ge d[v] \; }[/math].
Предикат P обозначает конъюнкцию двух вышеупомянутых условий:
[math]\displaystyle{ P(r, t) \triangleq P0(r) \and P1(t) \and P2(r, t) \; }[/math].
Ресинхронизация с достижением минимальной длительности представляет собой решение [math]\displaystyle{ \langle r, t \rangle \; }[/math], удовлетворяющее следующему условию оптимальности:
[math]\displaystyle{ P3 \triangleq \forall r', t': P(r', t') \implies max(t) \le max(t') \; }[/math], где [math]\displaystyle{ max(t) \triangleq max_{v \in V} \; t[v] }[/math].
Далее будет обсуждаться только допустимая ресинхронизация (r', t'), поэтому для упрощения изложения условие на диапазон P(r', t') часто будет опущено; значение будет очевидно из контекста.
Основные результаты
В данном разделе будет показано, как разработать эффективный алгоритм для решения задачи ресинхронизации с минимальной длительностью. В отличие от обычного стиля изложения, когда представлен только финальный продукт, т.е. алгоритм, но не идеи по его разработке, далее будет изложен поэтапный процесс, приводящий в конечном итоге к созданию алгоритма.
Разработка алгоритма заключается в построении процедуры, такой, что ее выполнение завершится через конечное число шагов, а при завершении она будет удовлетворять заданному предикату. В случае задачи ресинхронизации с минимальной длительностью должен удовлетворяться предикат [math]\displaystyle{ P0 \and P1 \and P2 \and P3 \; }[/math]. Этот предикат также называется постусловием. Можно утверждать, что любой нетривиальный алгоритм будет содержать по меньшей мере один цикл; в противном случае продолжительность обработки пропорциональна просто длине текста. Следовательно, некоторая часть постусловий будет итеративно удовлетворяться в цикле, тогда как оставшаяся часть будет изначально удовлетворяться в процессе инициализации и оставаться инвариантной во время выполнения цикла.
Первое решение, которое необходимо принять, касается разбиения постусловий на возможные инварианты цикла и его цель. Из четырех конъюнктивных членов предикат P3 задает условие оптимальности и является самым сложным из всех. Следовательно, он будет рассматриваться как цель при выполнении цикла. С другой стороны, предикаты P0 и P1 легко могут быть удовлетворены при помощи простой инициализации:
r, t := 0, d.
Основываясь на этих соображениях, мы планируем разработать алгоритм согласно следующей схеме.
r, t := 0, d do [math]\displaystyle{ \{ P0 \and P1 \} \; }[/math] [math]\displaystyle{ \neg P2 \to update \; t }[/math] [math]\displaystyle{ \neg P3 \to update \; r }[/math] od [math]\displaystyle{ \{ P0 \and P1 \and P2 \and P3 \} \; }[/math].
Первую команду цикла можно переписать в виде [math]\displaystyle{ \exist (u, v) \in E: r[u] - r[v] = w[u, v] \and t[v] - t[u] \lt d[v] \to t[v] := t[u] + d[v] \; }[/math].
Фактически это релаксация алгоритма Беллмана-Форда для вычисления самых длинных путей.
Вторая команда не так проста. Если [math]\displaystyle{ \neg P3 \; }[/math], иначе говоря, если существует другая допустимая ресинхронизация [math]\displaystyle{ \langle r', t' \rangle \; }[/math], такая, что max(t) > max(t'), тогда на любой вершине v, для которой выполняется t[v] = max(t), должно выполняться соотношение t'[v] < t[v]. Для этих вершин известно следующее свойство:
[math]\displaystyle{ \forall v \in V: t'[v] \lt t[v] =\gt (\exist u \in V: r[u] - r[v] \gt r'[u] - r'[v]) \; }[/math],
что означает, что если время прибытия вершины v меньше при другой ресинхронизации [math]\displaystyle{ \langle r', t' \rangle \; }[/math], тогда должна существовать вершина u, такая, что r' обеспечивает больше регистров между u и v. Фактически одной такой вершиной u является начальная вершина самого длинного комбинационного пути к v, дающего задержку t[v].
Для сокращения длительности цикла переменную r необходимо изменить, сделав ее ближе к r'. Следует отметить, что в контексте ресинхронизации важны не абсолютные значения r, но их разности. Если [math]\displaystyle{ \langle r, t \rangle \; }[/math] является решением задачи ресинхронизации, то [math]\displaystyle{ \langle r + c, t \rangle \; }[/math], где [math]\displaystyle{ c \in \mathbb{Z} \; }[/math] – произвольная константа, также будет являться решением. Следовательно, r может быть сделана «ближе» к r' за счет размещения большего количества регистров между u и v, то есть либо за счет уменьшения r[u], либо за счет увеличения r[v]. Отметим, что v можно легко определить из соотношения t[v] = max(t). Независимо от того, какое значение (r[v] или r[u]) выбрано для изменения, изменение должно быть единичным, поскольку r не следует чрезмерно корректировать. Таким образом, после корректировки будут по-прежнему выполняться соотношения [math]\displaystyle{ r[v] - r[u] \le r'[v] - r'[u] \; }[/math] или, что эквивалентно, [math]\displaystyle{ r[v] - r'[v] \le r[u] - r'[u] \; }[/math]. Поскольку v легко определить, выберем для увеличения r[v]. Время прибытия t[v] можно незамедлительно уменьшить до d[v]. Это позволяет уточнить вторую команду:
[math]\displaystyle{ \neg P3 \and P2 \and \exist v \in V: t[v] = max(t) \to r[v], t[v] :=r[v] + 1, d[v] \; }[/math].
Поскольку во время выполнения этой операции регистры перемещаются, предикат P2 может перестать выполняться. Однако первая команда восстановит статус кво. Эта команда увеличивает t для некоторых вершин; некоторые из них даже могут превысить значение max(t) до перемещения регистра. Аналогичное рассуждение для [math]\displaystyle{ \langle r, t \rangle \; }[/math] показывает, что их значения r также подвергаются увеличению. Таким образом, для реализации данного «насколько возможно быстрого» (As-Soon-As-Possible, ASAP) увеличения r необходимо сделать моментальный снимок max(t), пока предикат P2 еще актуален. Физически такой моментальный снимок записывает один такт применимой длительности [math]\displaystyle{ \phi \; }[/math] и может быть реализован при помощи добавления к циклу еще одной команды:
[math]\displaystyle{ P2 \and \phi \gt max(t) \to \phi := max(t) \; }[/math].
Однако подобная ASAP-операция может увеличить r[u] даже в случае w[u, v] - r[u] + r[v] = 0 для ребра (u, v). Это означает, что P0 может быть уже не инвариантом. Однако перемещение P0 из инварианта в цель цикла не составит проблемы, поскольку для этого в цикл можно добавить одну команду:
[math]\displaystyle{ \exist (u, v) \in E: r[u] - r[v] \gt w[u, v] \to r[v] := r[u] - w[u, v] \; }[/math].
После объединения всех нововведений алгоритм приобретает следующую форму.
[math]\displaystyle{ r, t, \phi := 0, d, \infty \; }[/math] do {P1} [math]\displaystyle{ \exist \; (u, v) \in E: r[u] - r[v] = w[u, v] }[/math] [math]\displaystyle{ \and \; t[v] - t[u] \lt d[v] \to t[v] := t[u] + d[v] }[/math] [math]\displaystyle{ \neg P3 \and \exist \; v \in V: t[v] \ge \phi }[/math] [math]\displaystyle{ \to r[v], t[v] := r[v] + 1, d[v] }[/math] [math]\displaystyle{ P0 \and P2 \and \phi \gt max(t) \to \phi := max(t) }[/math] [math]\displaystyle{ \exist \; (u, v) \in E: r[u] - r[v] \gt w[u, v] }[/math] [math]\displaystyle{ \to r[v] := r[u] - w[u, v] }[/math] [math]\displaystyle{ od \{ P0 \and P1 \and P2 \and P3 \}. \; }[/math]
Название | Кол-во | Длительность такта | [math]\displaystyle{ \sum r }[/math] | Кол-во | Время | ASTRA | ||
---|---|---|---|---|---|---|---|---|
вентилей | до | после | обновлений | A(s) | B(s) | |||
s1423 | 490 | 166 | 127 | 808 | 7619 | 0,02 | 0,03 | 0,02 |
s1494 | 558 | 89 | 88 | 628 | 7765 | 0,02 | 0,01 | 0,01 |
s9234 | 2027 | 89 | 81 | 2215 | 76943 | 0,12 | 0,11 | 0,09 |
s9234.1 | 2027 | 89 | 81 | 2164 | 77644 | 0,16 | 0,11 | 0,10 |
s13207 | 2573 | 143 | 82 | 4086 | 28395 | 0,12 | 0,38 | 0,12 |
s15850 | 3448 | 186 | 77 | 12038 | 99314 | 0,36 | 0,43 | 0,17 |
s35932 | 12204 | 109 | 100 | 16373 | 108459 | 0,28 | 0,24 | 0,65 |
s38417 | 8709 | 110 | 56 | 9834 | 155489 | 0,58 | 0,89 | 0,64 |
s38584 | 11448 | 191 | 163 | 19692 | 155637 | 0,41 | 0,50 | 0,67 |
s38584.1 | 11448 | 191 | 183 | 9416 | 114940 | 0,48 | 0,55 | 0,78 |
Таблица 1. Экспериментальные результаты
Для завершения разработки алгоритма осталось реализовать проверку [math]\displaystyle{ \neg P3 }[/math]. Из предыдущего обсуждения мы уже знаем, что из [math]\displaystyle{ \neg P3 }[/math] следует, что существует такая вершина u, что [math]\displaystyle{ r[u] - r'[u] \ge r[v] - r'[v] \; }[/math] после каждого увеличения r[v]. Это означает, что [math]\displaystyle{ max_{v \in V} \; r[v] - r'[v] }[/math] не будет увеличиваться. Иначе говоря, существует по меньшей мере одна вершина v, у которой r[v] не будет меняться. До увеличения r[v] имеет место соотношение [math]\displaystyle{ w_{u \rightsquigarrow v} - r[u] + r[v] \le 0 \; }[/math], где [math]\displaystyle{ w_{u \rightsquigarrow v} \ge 0 \; }[/math] – исходное количество регистров на одном пути из u в v, в результате чего неравенство [math]\displaystyle{ r[v] - r[u] \le 1 \; }[/math] остается верным даже после увеличения r[v]. Из этого следует, что будет по меньшей мере i + 1 вершин, у которых r не превышает i для [math]\displaystyle{ 0 \le i \lt |V| \; }[/math]. Иными словами, алгоритм может по-прежнему увеличивать r, и когда какое-либо значение r достигнет |V|, это покажет, что условие P3 удовлетворяется. Таким образом, полный алгоритм имеет следующую форму:
[math]\displaystyle{ r, t, \phi := 0, d, \infty \; }[/math] do {P1} [math]\displaystyle{ \exist \; (u, v) \in E: r[u] - r[v] = w[u, v] }[/math] [math]\displaystyle{ \and \; t[v] - t[u] \lt d[v] \to t[v] := t[u] + d[v] }[/math] [math]\displaystyle{ (\forall \; v \in V: r[v] \lt |V|) }[/math] [math]\displaystyle{ \and \; \exist \; v \in V: t[v] \ge \phi \to r[v], t[v] := r[v] + 1, d[v] }[/math] [math]\displaystyle{ (\exist \; v \in V: r[v] \ge |V|) }[/math] [math]\displaystyle{ \and \; \exist \; v \in V: t[v] \ge \phi \to r[v], t[v] := r[v] + 1, d[v] }[/math] [math]\displaystyle{ P0 \and P2 \and \phi \gt max(t) \to \phi := max(t) }[/math] [math]\displaystyle{ \exist \; (u, v) \in E: r[u] - r[v] \gt w[u, v] }[/math] [math]\displaystyle{ \to r[v] := r[u] - w[u, v] }[/math] [math]\displaystyle{ od \{ P0 \and P1 \and P2 \and P3 \} \; }[/math].
Корректность алгоритма можно легко показать в силу того, что P1 остается инвариантом и из отрицания предикатов следует [math]\displaystyle{ P0 \and P2 \and P3 \; }[/math]. Завершение работы алгоритма гарантируется монотонным возрастанием r и его верхней границей. Следующая теорема задает время выполнения в наихудшем случае.
Теорема 1. Время выполнения данного алгоритма ресинхронизации в наихудшем случае ограничено сверху значением [math]\displaystyle{ O(|V|^2 \; |E|) }[/math].
Время выполнения алгоритма ресинхронизации в наихудшем случае будет актуальным в случае, когда каждое увеличение r приводит к «протягиванию» синхронизации по всей схеме (т.е. по |E| ребрам). Это верно только тогда, когда увеличение r перемещает все регистры в схеме. Однако в таком случае верхняя граница r равна 1, и время выполнения не превышает O(|V| |E|). С другой стороны, если значение r велико, схема разбивается регистрами на несколько меньших фрагментов, в результате чего протягивание, вызванное увеличением одного r, ограничено деревом небольшого размера.
Применение
В базовом алгоритме оптимальность P3 проверяется условием [math]\displaystyle{ r[v] \ge |V| \; }[/math]. Однако в большинстве случаев условие оптимальности можно обнаружить намного раньше. Поскольку при каждом возрастании r[v] должна существовать «вершина-хранитель» u, такая, что после выполнения действия будет верно неравенство [math]\displaystyle{ r[u] - r'[u] \ge r[v] - r'[v] \; }[/math]. Следовательно, если ввести указатель из v на u при увеличении r[v], указатели не смогут образовать цикл согласно [math]\displaystyle{ \neg P3 }[/math]. Фактически указатели образуют лес, в котором корни имеют значение r = 0, а потомок может иметь значение r, не более чем на 1 превышающее значение его предка. Использование цикла указателей как свидетельство верности P3 вместо [math]\displaystyle{ r[v] \ge |V| \; }[/math], можно значительно повысить практическую эффективность алгоритма.
Открытые вопросы
Ресинхронизация нередко используется для оптимизации длительности цикла либо количества регистров в схеме. Описанный алгоритм решает только задачу ресинхронизации с достижением минимальной длительности. Задачу ресинхронизации с достижением минимального количества регистров для заданной длительности цикла решили Лейзерсон и Сакс [1], она представлена в соответствующей статье. Их алгоритм сводит задачу к двойственной проблеме поиска сетевого потока с минимальной стоимостью в плотном графе. Остается открытым любопытный вопрос – можно ли разработать эффективный итеративный алгоритм для решения задачи о минимальном количестве регистров, схожий с алгоритмом Чжоу.
Экспериментальные результаты
Результаты были опубликованы Чжоу [3] по итогам сравнения времени выполнения алгоритма с эффективной эвристикой под названием ASTRA [ ]. Результаты прогона на эталонных тестах ISCAS89 представлены в таблице 1 из работы [3]; столбцы A и B таблицы отражают время выполнения двух этапов ASTRA.
См. также
Литература
1. Leiserson, C.E., Saxe, J.B.: Retiming synchronous circuitry. Algorithmica6,5-35(1991)
2. Sapatnekar, S.S., Deokar, R.B.: Utilizing the retiming-skew equivalence in a practical algorithm for retiming large circuits. IEEE Transactions on Computer Aided Design 15,1237-1248 (1996)
3. Zhou, H.: Deriving a new efficient algorithm for min-period retiming. In: Asia and South Pacific Design Automation Conference, Shanghai, China, January 2005