Transport-Triggered Architecture (TTA)

Основная идея - получение большего быстродействия МП с помощью поддержки ещё большего параллелизма.

Архитектура ТТА достаточно сильно отличается от других архитектур - взаимодействие всей частей системы построено на базе транспортного коммутатора, и собственно имеется только одна инструкция - MOVE. Идея достаточно красивая, реализация состоит в том, что коммутатор направляет данные от одного функционального устройства (ФУ) к другому, данные защелкиваются на выходах или входах устройств. ТТА ориентирована более на компилятор, а не на аппаратное обеспечение в вопросах расписания инструкций, распределения ресурсов и разрешения зависимостей. Группа разработчиков во главе с Хенком Корпоралом (Henk Corporaal) в голландском университете в Дельфте построила экспериментальный ТТА-процессор.

Если традиционный МП программируется с помощью спецификации операций, перемещающих данные между регистрами и модифицирующих их в АЛУ, например, инструкция ADD обычно (берет из памяти) складывает 2 операнда и получает результат (отдавая его в память). Такие машины ( в том числе CISC и RISC) могут быть описаны как имеющие OTA архитектуру (Operation-Triggered Architectures). ТТА разбивает эти операции на перемещения данных, таким образом инструкция ADD превращается в три отдельных операции. Такой подход обеспечивает больший скалярный параллелизм, чем параллелизм инструкций.

ТТА-МП состоит из нескольких функциональных устройств (ФУ), банка (регистров общего назначения) РОНов и некоторого коммутатора (шин), которые могут передвигать данные между ФУ и РОНами. Коммутатор образует сеть соединений между устройствами, пропусканая способность сети определяет возможности МП.

Регистры в ТТА бывают нескольких категорий: 1) регистры операндов; 2) регистры-триггеры; 3) регистры результатов; 4) РОНы. Первые три содержатся в ФУ - в ЭВМ типа OTA они называются задвижками, но в ТТА у них есть "имена" и они видимы для программной модели. Только РОНы являются теми регистрами, которые знакомы нам по ЭВМ типа OTA.

Операция ТТА начинается с загрузки операндов в регистры операндов ФУ. Последний операнд идёт в триггерный регистр, сигнализирующий ФУ, что все операнды готовы, и операция начинается. Результат помещается в регистр результата ФУ. Результат должен быть сохранён в РОНе, если но нужен не только в последующем цикле. Например, программа для ТТА для сложения двух чисел может выглядеть так:

   r2 -> add_o
   r3 -> add_t
   add_r -> r4

Стрелки показывают инструкции ТТА MOVE. Первая инструкция перемещает операнд из РОНа r2 в устройство сложения. Вторая инструкция помещает 2-й операнд в триггерный регистр сумматора (add_t) и стартует сложение. Последняя команда сохраняет результат в РОН r4.

Отметим две особенности. Во-первых, в принципе перемещение всех операндов может быть сделано за один цикл, число перемещений ограничивается возможностями коммутатора. Во-вторых, время между сигналом триггера в сумматор и получением результата на выходах сумматора не может быть меньше чем время выполнения сложения. Хотя, в отличие от суперскалярных МП RISC, в которых несколько ФУ могут пользоваться одним конвейером, каждый ФУ в ТТА имеет свой личный конвейер и размещение инструкций по конвейерам является проблемой, решаемой компилятором.

Управление вычислениями в ТТА базируется на "стражах", которые определяют может ли выполниться перемещение, основываясь на значениях специальных 1-разрядных предикатных регистров (равнозначных битам статуса в ЭВМ с OTA). ФУ сравнения устанавливаю значения этих битов. Строка программы

line if r = r3 then goto label 

компилируется в следующие перемещения:

   r2 -> eq_o ; загрузка операнда в ФУ `равно'
   r3 -> eq_t ; второй операнд даёт сигнал и начинает сравнение
   eq_r -> b4 ; результат в предикатном регистре b4
   b4 ? label -> pc  ; если установлен b4 то переход к label

Переходы производятся с помощью перемещения адреса прямо в стётчик команд, который видим для программы в ТТА. Последняя инструкция показывает, как регистр b4 обеспечивает условный переход. В ТТА для программы видим также регистр инструкции, для обеспечения загрузки длинных непосредственных операндов из потока инструкций. Короткие непосредственные операнды могут быть указаны прямо в инструкции перемещения, например:

 48 -> r2. 

Преимущества ТТА.

Концепция ТТА предлагает несколько преимуществ с точки зрения проектировщика аппаратуры, наиболее значимы из которых большая тактовая частота и потенцально большее использование ФУ, чем в суперскалярных RISC.

Хотя устройство суперскалярных RISC достаточно совершенно и по показателем числа запускаемых инструкций в такте, для выявления зависимостей необходимы вентили на кристалле, к тому же выявление зависимостей становится всё более сложным и сложным, отъедая всё большую площадь на чипе. В ТТА эта логика не нужна. Далее, отделение ФУ от коммутатора обозначает оптимизацию конвейеров ФУ до оптимальных времён работ. Коммутатор изнутри может быть конвейеризирован, в этот случае ограничением быстродействия является время распростарения сигнала в полупроводнике.

Суперскалярные МП с OTA так же должны давать большую полосу пропускания по внутренним шинам, поскольку для каждой операции требуется 3 шины (худший случай), и число шин велико, хотя большиство инструкций могут их и не использовать. В МП с ТТА разделение коммутации от операций обозначает, что ФУ используют общий коммутатор, поэтому полная полоса пропускания будет ближе к имеющейся, даже в худшем случае. Т.е. то же самое количество проводников израсходованное на коммутатор ТТА обслуживает большее количество ФУ, чем это может быть на суперскалярном процессоре. Это позволяет МП с ТТА быть более способным к расширению, чем МП с OTAs, так как добавление ФУ и линий коммутации более простой процесс, чем маленькое изменение архитектуры МП (???).

Дополнительно, ТТА предоставлет потенциально большее пространство для оптимизаций в компиляторе (и их новые классы ???), чем МП с OTAs. Низкоуровневый параллелизм даёт большую свободу при определении расписания инструкций, например коммутатор может занимать линии коммутатора пока ФУ выполняет операции (???).

Связывание операций, которое производится аппаратурой в современных RISC МП с OTA, производится программой в ТТА. Компилятор может переместить результат операции прямо с выхода ФУ на вход другого ФУ, минуя регистры:

   add_r -> mul_o
   add_r -> r2

Если компилятор видит, что все результаты операции используются таким образом, он удаляет перемещение результата в регистр. Аналогично, если ФУ использует одно и тоже значение в серии операций (например в цикле), компилятор может оставить только одно первое перемещение. В общем, что-то типа удаления общих подвыражений.

В результате таких оптимизаций, ТТА машина использует меньшее количество РОНов чем эквивалентная OTA, поскольку часто сохранение результатов идёт только в операндные регистры, без занятия РОН.

Технология компиляции.

Ясно что компиляторы для МП с ТТА должны эффективно обнаруживать параллелизм инструкций и использовать все возможности оптимизации. Есть мнение, что ТТА являются концом исторической цепочки CISC - RISC - VLIW (Very Long Instruction Word) в том смысле, что задачи, выполнявшиеся микрокодом (декодирование инструкций, расписание команд, распределение регистров, анализ зависимостей) постепенно перекладываются на компилятор.

В частности, компиляторы для ТТА должны исследовать большие блоки, чем традиционный базовый блок, а скорее трассу ББ, что и разрабатывалось в переделанном компиляторе Gnu C/C++. Описание технологии компиляции опустим - разработчики сделали банальный вывод о необходимости применения искусственного интеллекта при компиляции.

Будущее TTA

Команда Корпорала сделала експериментальный 32-разрядный целочисленный МП с 8-ю ФУ И 4-мя шинами, названный MOVE32INT. Даже реализованный в устраревшем 2-микронном техпроцессе, MOVE32INT работает на частоте 80 Мгц, и тестовые испытания показывают, что он на 25-50% превосходит по быстродействю аналогичный суперскалярный МП с OTA с таким же числом ФУ.

В общем, скорость не единственный рассматриваемый параметр, много вопросов, специфичных для VLIW также рассматриваются для TTA. Принципиально, тяжело обеспечить совместимость системы команд между поколеними процессоров, так как команды жёстко привязаны к аппаратной части. Вообще, MOVE32INT - часть исследования по автоматической генерации ASIC (application-specific IC) из программных спецификаций, и никогда не планировалось его применять как МП общего назначения.

Transport-Triggered Processor

TTA МП состоит из полностью независимых ФУ, объединённых транспортирующим коммутатором. Составление расписания перемещений является задачей компилятора, а не аппаратного обеспечения.