В архитектуре компьютера архитектура с транспортным запуском ( TTA ) — это разновидность конструкции процессора , в которой программы напрямую управляют внутренними транспортными шинами процессора. Вычисления происходят как побочный эффект переноса данных: запись данных в порт запуска функционального блока запускает функциональный блок для запуска вычисления. Это похоже на то, что происходит в систолическом массиве . Благодаря своей модульной структуре TTA является идеальным шаблоном процессора для процессоров с набором инструкций, специфичным для приложений ( ASIP ), с настраиваемым трактом данных, но без негибкости и стоимости проектирования аппаратных ускорителей с фиксированной функцией.
Обычно процессор с транспортным запуском имеет несколько транспортных шин и несколько функциональных блоков, подключенных к шинам, что обеспечивает возможности для параллелизма на уровне инструкций . Параллелизм статически определяется программистом. В этом отношении (и, очевидно, из-за большой ширины слова инструкции) архитектура TTA напоминает архитектуру очень длинного слова инструкции (VLIW). Слово инструкции TTA состоит из нескольких слотов, по одному слоту на шину, и каждый слот определяет транспортировку данных, которая происходит на соответствующей шине. Тонкозернистый контроль позволяет выполнять некоторые оптимизации, которые невозможны в обычном процессоре. Например, программное обеспечение может передавать данные напрямую между функциональными блоками без использования регистров.
Запуск транспорта раскрывает некоторые микроархитектурные детали, которые обычно скрыты от программистов. Это значительно упрощает логику управления процессором, поскольку многие решения, обычно принимаемые во время выполнения , фиксируются во время компиляции . Однако это также означает, что двоичный файл, скомпилированный для одного процессора TTA, не будет работать на другом без перекомпиляции, если между ними есть даже небольшая разница в архитектуре. Проблема двоичной несовместимости, в дополнение к сложности реализации полного переключения контекста, делает TTA более подходящими для встраиваемых систем , чем для вычислений общего назначения.
Из всех архитектур компьютеров с одним набором команд архитектура TTA является одной из немногих, на основе которой были созданы процессоры, и единственной, на основе которой процессоры продаются в коммерческих целях.
TTA можно рассматривать как архитектуры VLIW с "открытым трактом данных". В то время как VLIW программируется с использованием операций, TTA разделяет выполнение операции на несколько операций перемещения . Модель программирования низкого уровня обеспечивает несколько преимуществ по сравнению со стандартным VLIW. Например, архитектура TTA может обеспечить больший параллелизм с более простыми файлами регистров, чем с VLIW. Поскольку программист контролирует синхронизацию операнда и передачи данных результата, сложность (количество входных и выходных портов) файла регистров (RF) не нужно масштабировать в соответствии с наихудшим сценарием выпуска/завершения нескольких параллельных инструкций.
Важная уникальная программная оптимизация, обеспечиваемая транспортным программированием, называется программным обходом . В случае программного обхода программист обходит обратную запись регистрового файла, перемещая данные непосредственно в порты операнда следующего функционального блока. Когда эта оптимизация применяется агрессивно, исходный ход, который переносит результат в регистровый файл, может быть полностью устранен, тем самым уменьшая как давление порта регистрового файла, так и освобождая регистр общего назначения для других временных переменных. Уменьшенное давление регистра , в дополнение к упрощению требуемой сложности радиочастотного оборудования, может привести к значительной экономии энергии ЦП , что является важным преимуществом, особенно в мобильных встраиваемых системах. [1] [2]
Процессоры TTA состоят из независимых функциональных блоков и регистровых файлов , которые соединены с транспортными шинами и сокетами .
Каждый функциональный блок реализует одну или несколько операций , которые реализуют функциональность от простого сложения целых чисел до сложных и произвольных определяемых пользователем вычислений, специфичных для приложения. Операнды для операций передаются через порты функционального блока .
Каждый функциональный блок может иметь независимый конвейер . В случае, если функциональный блок полностью конвейеризирован , новая операция, которая занимает несколько тактов для завершения, может быть запущена в каждом такте. С другой стороны, конвейер может быть таким, что он не всегда принимает новые запросы на запуск операции, пока старая все еще выполняется.
Доступ к памяти данных и связь с внешним миром процессора осуществляется с помощью специальных функциональных блоков. Функциональные блоки, которые реализуют операции доступа к памяти и подключаются к модулю памяти, часто называются блоками загрузки/хранения .
Блок управления — это особый случай функциональных блоков, который управляет выполнением программ. Блок управления имеет доступ к памяти инструкций для извлечения инструкций для выполнения. Чтобы позволить исполняемым программам передавать выполнение (переходить) в произвольную позицию в исполняемой программе, блок управления обеспечивает операции потока управления. Блок управления обычно имеет конвейер инструкций , который состоит из стадий для извлечения, декодирования и выполнения программных инструкций.
Файлы регистров содержат регистры общего назначения , которые используются для хранения переменных в программах. Как и функциональные блоки, файлы регистров также имеют входные и выходные порты. Количество портов чтения и записи, то есть возможность считывать и записывать несколько регистров в одном и том же такте, может различаться в каждом файле регистров.
Архитектура межсоединений состоит из транспортных шин , которые подключаются к портам функциональных блоков с помощью сокетов . Из-за стоимости подключения обычно сокращают количество соединений между блоками (функциональными блоками и файлами регистров). TTA считается полностью подключенным , если существует путь от каждого выходного порта блока к каждому входному порту блока.
Сокеты предоставляют средства для программирования процессоров TTA, позволяя выбирать, какие соединения шина-порт сокета включены в любой момент времени. Таким образом, транспорты данных, происходящие в тактовом цикле, могут быть запрограммированы путем определения исходного и целевого соединения сокета/порта, которое должно быть включено для каждой шины.
Некоторые реализации TTA поддерживают условное выполнение .
Условное выполнение реализуется с помощью охранников . Каждый транспорт данных может быть обусловлен охранником, который подключен к регистру (часто 1-битному условному регистру ) и к шине. В случае, если значение охраняемого регистра оценивается как ложное (ноль), транспорт данных, запрограммированный для шины, к которой подключен охранник, сжимается , то есть не записывается в пункт назначения. Безусловные транспорты данных не подключены ни к одному охраннику и всегда выполняются.
Все процессоры, включая процессоры TTA, включают инструкции потока управления , которые изменяют счетчик программ, которые используются для реализации подпрограмм , if-then-else , for-loop и т. д. Язык ассемблера для процессоров TTA обычно включает инструкции потока управления, такие как безусловные переходы (JUMP), условные относительные переходы (BNZ), вызов подпрограммы (CALL), условный возврат (RETNZ) и т. д., которые выглядят так же, как соответствующие инструкции языка ассемблера для других процессоров.
Как и все другие операции на машине TTA, эти инструкции реализованы как инструкции «перемещения» в специальный функциональный блок.
Реализации TTA, поддерживающие условное выполнение, такие как sTTAck и первый прототип MOVE, могут реализовать большинство этих инструкций потока управления как условный переход к счетчику программ. [3] [4]
Реализации TTA, которые поддерживают только безусловные транспорты данных, такие как Maxim Integrated MAXQ, [5] обычно имеют специальный функциональный блок, тесно связанный со счетчиком программ, который реагирует на различные адреса назначения. Каждый такой адрес, когда используется в качестве назначения "перемещения", имеет разный эффект на счетчик программ — каждая инструкция "относительного перехода <условие>" имеет разный адрес назначения для каждого условия; и другие адреса назначения используются CALL, RETNZ и т. д.
В более традиционных архитектурах процессоров процессор обычно программируется путем определения выполняемых операций и их операндов. Например, инструкция сложения в архитектуре RISC может выглядеть следующим образом.
добавить r3, r1, r2
В этом примере операция складывает значения регистров общего назначения r1 и r2 и сохраняет результат в регистре r3. Грубо говоря, выполнение инструкции в процессоре, вероятно, приводит к трансляции инструкции в управляющие сигналы, которые управляют соединениями сети взаимосвязей и функциональными блоками. Сеть взаимосвязей используется для передачи текущих значений регистров r1 и r2 в функциональный блок, который способен выполнять операцию сложения, часто называемый ALU, как в арифметико-логическом блоке. Наконец, управляющий сигнал выбирает и запускает операцию сложения в ALU, результат которой передается обратно в регистр r3.
Программы TTA не определяют операции, а только транспорты данных, необходимые для записи и чтения значений операндов. Сама операция запускается путем записи данных в запускающий операнд операции. Таким образом, операция выполняется как побочный эффект запускающей транспортировки данных. Следовательно, выполнение операции сложения в TTA требует трех определений транспортировки данных, также называемых перемещениями . Перемещение определяет конечные точки для транспортировки данных, происходящей в транспортной шине. Например, перемещение может указывать, что транспорт данных из функционального блока F, порт 1, в регистровый файл R, индекс регистра 2, должен происходить в шине B1. В случае, если в целевом процессоре имеется несколько шин, каждая шина может использоваться параллельно в одном и том же тактовом цикле. Таким образом, можно использовать параллелизм уровня транспортировки данных, планируя несколько транспортов данных в одной и той же инструкции.
Операция сложения может быть выполнена в процессоре TTA следующим образом:
r1 -> АЛУ.операнд1r2 -> ALU.add.triggerALU.результат -> r3
Второй ход, запись во второй операнд функционального блока, называемого АЛУ, запускает операцию сложения. Это делает результат сложения доступным в выходном порту 'result' после задержки выполнения 'add'.
Порты, связанные с АЛУ, могут действовать как аккумулятор , позволяя создавать макрокоманды , абстрагирующие базовый TTA:
lda r1 ; "load ALU": переместить значение в операнд ALU 1 add r2 ; add: переместить значение в триггер add sta r3 ; "store ALU": переместить значение из результата ALU
Ведущая философия TTA заключается в переносе сложности с аппаратного обеспечения на программное обеспечение. Из-за этого для программиста вводятся несколько дополнительных опасностей. Одна из них — слоты задержки , видимая программисту задержка работы функциональных блоков. Синхронизация полностью лежит на программисте. Программист должен планировать инструкции таким образом, чтобы результат не был считан ни слишком рано, ни слишком поздно. Нет никакого аппаратного обнаружения, которое блокировало бы процессор в случае, если результат считан слишком рано. Рассмотрим, например, архитектуру, которая имеет операцию add с задержкой 1 и операцию mul с задержкой 3. При запуске операции add можно прочитать результат в следующей инструкции (следующий такт), но в случае mul нужно ждать две инструкции, прежде чем результат может быть считан. Результат готов для 3-й инструкции после инструкции triggering.
Чтение результата слишком рано приводит к чтению результата ранее запущенной операции, или в случае, если ранее в функциональном блоке не было запущено никакой операции, считанное значение не определено. С другой стороны, результат должен быть прочитан достаточно рано, чтобы быть уверенным, что результат следующей операции не перезапишет еще не прочитанный результат в выходном порту.
Из-за обилия видимого программистом контекста процессора, который фактически включает в себя, помимо содержимого файла регистра, также содержимое регистра конвейера функционального блока и/или входные и выходные порты функционального блока, сохранение контекста, необходимое для поддержки внешних прерываний, может стать сложным и дорогим для реализации в процессоре TTA. Поэтому прерывания обычно не поддерживаются процессорами TTA, но их задача делегируется внешнему оборудованию (например, процессору ввода-вывода) или их необходимость избегается с помощью альтернативного механизма синхронизации/связи, такого как опрос.
Архитектура на основе регистров, запускаемая транспортом, позволяет кодировать все инструкции как простые операции передачи. Все инструкции сводятся либо к записи непосредственного значения в целевой регистр или ячейку памяти, либо к перемещению данных между регистрами и/или ячейками памяти.