Классический конвейер RISC - Classic RISC pipeline

в история компьютерного оборудования, некоторые рано компьютер с сокращенным набором команд центральные процессоры (ЦП RISC) использовали очень похожее архитектурное решение, теперь называемое классический конвейер RISC. Эти процессоры были: MIPS, SPARC, Motorola 88000, а затем условный ЦП DLX изобретен для образования.

Каждый из этих классических скалярных RISC-проектов выбирает и пытается выполнить одна инструкция за цикл. Основная общая концепция каждого дизайна - пятиэтапное исполнение. конвейер команд. Во время работы каждый этап конвейера работает по одной инструкции за раз. Каждый из этих этапов состоит из набора шлепки держать государство, и комбинационная логика который работает на выходах этих триггеров.

Классический пятиступенчатый конвейер RISC

Базовый пятиступенчатый конвейер в RISC машина (IF = Получение инструкции, ID = декодирование инструкции, EX = выполнение, MEM = доступ к памяти, WB = обратная запись регистра). Вертикальная ось - последовательные инструкции; горизонтальная ось - время. Таким образом, в зеленом столбце самая ранняя инструкция находится на стадии WB, а последняя инструкция подвергается выборке.

Получение инструкции

Инструкции находятся в памяти, чтение которой занимает один цикл. Эта память может быть выделенной SRAM или инструкцией. Кеш. Термин «задержка» часто используется в информатике и означает время от начала операции до ее завершения. Таким образом, выборка инструкции имеет задержку в один такт (при использовании SRAM с одним циклом или если инструкция была в кэше). Таким образом, во время Получение инструкции На этапе 32-битная инструкция извлекается из памяти команд.

В Счетчик команд, или PC, представляет собой регистр, который содержит адрес, представленный памяти команд. В начале цикла адрес представляется в память команд. Затем во время цикла инструкция считывается из памяти инструкций, и в то же время выполняется расчет для определения следующего ПК. Расчет следующего ПК выполняется путем увеличения ПК на 4 и выбора того, следует ли использовать его в качестве следующего ПК или, альтернативно, использовать результат вычисления перехода / перехода в качестве следующего ПК. Обратите внимание, что в классическом RISC все инструкции имеют одинаковую длину. (Это то, что отделяет RISC от CISC. [1]). В исходных конструкциях RISC размер инструкции составляет 4 байта, поэтому всегда добавляйте 4 к адресу инструкции, но не используйте PC + 4 для случая принятого перехода, перехода или исключения (см. отложенные отделения, ниже). (Обратите внимание, что некоторые современные машины используют более сложные алгоритмы (предсказание ветвления и предсказание цели перехода ), чтобы угадать адрес следующей инструкции.)

Инструкция декодировать

Еще одна вещь, которая отличает первые машины RISC от более ранних машин CISC, заключается в том, что RISC не имеет микрокод.[2] В случае микрокодированных инструкций CISC, после выборки из кэша инструкций, биты инструкции сдвигаются вниз по конвейеру, где простая комбинационная логика на каждом этапе конвейера создает управляющие сигналы для канала данных непосредственно из битов инструкций. В этих конструкциях CISC очень мало декодирования выполняется на этапе, традиционно называемом этапом декодирования. Следствием этого отсутствия декодирования является необходимость использования большего количества битов инструкции для определения того, что делает инструкция. Это оставляет меньше битов для таких вещей, как индексы регистров.

Все инструкции MIPS, SPARC и DLX имеют не более двух входов регистров. На этапе декодирования индексы этих двух регистров идентифицируются в инструкции, и индексы представляются в регистровую память как адрес. Таким образом, два названных регистра считываются из зарегистрировать файл. В дизайне MIPS регистровый файл имел 32 записи.

В то же время, когда файл регистров читается, логика выдачи инструкций на этом этапе определяет, готов ли конвейер выполнить инструкцию на этом этапе. В противном случае логика проблемы приводит к остановке как этапа выборки инструкций, так и этапа декодирования. В цикле остановки входные триггеры не принимают новые биты, поэтому новые вычисления в течение этого цикла не производятся.

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

На этапе декодирования потребовалось довольно много оборудования: MIPS имеет возможность ветвления, если два регистра равны, поэтому 32-битное дерево И выполняется последовательно после чтения файла регистров, создавая очень длинный критический путь через этот stage (что означает меньшее количество циклов в секунду). Кроме того, для вычисления цели перехода обычно требовалось 16-битное сложение и 14-битный инкремент. Разрешение ветвления на этапе декодирования позволило получить только штраф за неправильное предсказание ветвления за один цикл. Поскольку ветви очень часто брались (и, следовательно, предсказывались неверно), было очень важно сохранить низкий штраф.

Выполнять

На этапе выполнения происходит собственное вычисление. Обычно этот каскад состоит из ALU, а также битового шифтера. Он также может включать множитель и делитель нескольких циклов.

ALU отвечает за выполнение логических операций (and, or, not, nand, nor, xor, xnor), а также за выполнение целочисленного сложения и вычитания. Помимо результата, ALU обычно предоставляет биты состояния, например, был ли результат 0 или произошло переполнение.

Бит шифтер отвечает за сдвиг и повороты.

Инструкции на этих простых RISC-машинах можно разделить на три класса задержки в зависимости от типа операции:

  • Операция регистр-регистр (задержка за один цикл): сложение, вычитание, сравнение и логические операции. На этапе выполнения два аргумента были переданы простому ALU, который сгенерировал результат к концу этапа выполнения.
  • Ссылка на память (двухцикловая задержка). Все загружается по памяти. На этапе выполнения ALU добавил два аргумента (регистр и постоянное смещение), чтобы создать виртуальный адрес к концу цикла.
  • Многоцикловые инструкции (Многие задержки цикла). Целочисленное умножение и деление, и все плавающая точка операции. На этапе выполнения операнды этих операций подавались в многоцикловый блок умножения / деления. Остальная часть конвейера могла продолжить выполнение, пока модуль умножения / деления выполнял свою работу. Чтобы не усложнять этап обратной записи и логику выдачи, инструкция мультицикла записывала свои результаты в отдельный набор регистров.

Доступ к памяти

Если требуется доступ к памяти данных, это делается на этом этапе.

На этом этапе результаты выполнения инструкций с задержкой одного цикла просто пересылаются на следующий этап. Такая пересылка гарантирует, что как одно-, так и двухцикловые инструкции всегда записывают свои результаты на одном и том же этапе конвейера, так что можно использовать только один порт записи в файл регистров, и он всегда доступен.

Для кэширования данных с прямым отображением и виртуальных тегов, самый простой из возможных многочисленные организации кэширования данных, два SRAM используются, один хранит данные, а другой - теги.

Обратная запись

На этом этапе как одиночные, так и двухцикловые инструкции записывают свои результаты в регистровый файл. Обратите внимание, что два разных этапа обращаются к регистровому файлу одновременно - этап декодирования читает два исходных регистра, в то же время, что и Этап обратной записи - это запись регистра назначения предыдущей инструкции. Для настоящего кремния это может быть опасно (подробнее об опасностях см. Ниже). Это связано с тем, что один из исходных регистров, считываемых при декодировании, может быть таким же, как регистр назначения, записываемый при обратной записи. Когда это происходит, то одни и те же ячейки памяти в регистровом файле читаются и записываются одновременно. На кремнии многие реализации ячеек памяти не будут работать правильно при одновременном чтении и записи.

Опасности

Хеннесси и Паттерсон придумали термин опасность для ситуаций, когда инструкции в конвейере дают неправильные ответы.

Структурные опасности

Структурные опасности возникают, когда две инструкции могут пытаться использовать одни и те же ресурсы одновременно. Классические конвейеры RISC избегали этих опасностей, копируя оборудование. В частности, инструкции перехода могли использовать ALU для вычисления целевого адреса перехода. Если бы ALU использовался для этой цели на этапе декодирования, инструкция ALU, за которой следовала бы ветвь, увидела бы, что обе инструкции пытались использовать ALU одновременно. Этот конфликт легко разрешить, сконструировав специализированный сумматор целевых переходов на этапе декодирования.

Опасности для данных

Опасности данных возникают, когда инструкция, составленная вслепую, будет пытаться использовать данные до того, как данные будут доступны в файле регистров.

В классическом конвейере RISC опасности данных можно избежать одним из двух способов:

Решение A. Обход

Обход также известен как пересылка операндов.

Предположим, ЦП выполняет следующий фрагмент кода:

SUB r3,r4 -> r10     ; Записывает r3 - r4 в r10И r10,r3 -> r11    ; Записывает r10 и r3 в r11

Этапы выборки и декодирования команд отправляют вторую инструкцию на один цикл после первой. Они стекают по трубопроводу, как показано на этой схеме:

Pipeline Data Hazard.svg

В наивный трубопровод, без учета опасности опасность для данных прогрессирует следующим образом:

В цикле 3 SUB инструкция вычисляет новое значение для r10. В том же цикле И операция декодируется, и значение r10 извлекается из файла реестра. Тем не менее SUB инструкция еще не написала свой результат r10. Обратная запись обычно происходит в цикле 5 (зеленая рамка). Следовательно, значение, прочитанное из файла регистров и переданное в ALU (на этапе Execute программы И операция, красный прямоугольник) неверна.

Вместо этого мы должны передать данные, которые были вычислены SUB вернуться к этапу выполнения (т.е. к красному кружку на диаграмме) И операция перед обычно пишется обратно. Решение этой проблемы - пара байпасных мультиплексоров. Эти мультиплексоры находятся в конце этапа декодирования, и их выходы с флопами являются входами для ALU. Каждый мультиплексор выбирает между:

  1. Порт чтения регистрового файла (т. Е. Вывод этапа декодирования, как в наивном конвейере): красный стрелка
  2. Текущий конвейер регистров ALU (для обхода одним этапом): синий стрелка
  3. Текущий конвейер регистров этапа доступа (который является либо загруженным значением, либо перенаправленным результатом ALU, это обеспечивает обход двух этапов): фиолетовый стрелка. Обратите внимание, что для этого необходимо передать данные назад вовремя на один цикл. Если это произойдет, пузырь должен быть вставлен, чтобы остановить И операция, пока данные не будут готовы.

Логика этапа декодирования сравнивает регистры, записанные инструкциями на этапах выполнения и доступа конвейера, с регистрами, считываемыми инструкцией на этапе декодирования, и заставляет мультиплексоры выбирать самые последние данные. Эти обходные мультиплексоры позволяют конвейеру выполнять простые инструкции с задержкой, равной только ALU, мультиплексору и триггеру. Без мультиплексоров задержка записи, а затем чтения файла регистров должна была бы быть включена в задержку этих инструкций.

Обратите внимание, что данные можно передавать только вперед вовремя - данные не могут быть возвращены на более ранний этап, если они еще не были обработаны. В приведенном выше случае данные передаются вперед (к моменту И готов к регистрации в АЛУ, SUB уже вычислил).

Пересылка данных (один этап) .svg

Решение Б. Блокировка трубопровода

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

LD  Адр    -> r10И r10,r3 -> r11

Данные, считанные с адреса Адр отсутствует в кэше данных до тех пор, пока не завершится этап доступа к памяти LD инструкция. К этому времени И инструкция уже идет через АЛУ. Чтобы решить эту проблему, потребовалось бы, чтобы данные из памяти были переданы назад во времени на вход ALU. Это невозможно. Решение состоит в том, чтобы отложить И инструкция по одному циклу. Опасность данных обнаруживается на этапе декодирования, а этапы выборки и декодирования остановился - они не могут сбрасывать свои входы и поэтому остаются в одном и том же состоянии в течение цикла. На этапах выполнения, доступа и обратной записи ниже по потоку отображается дополнительная инструкция без операции (NOP), вставленная между LD и И инструкции.

Этот NOP называется конвейером. пузырь поскольку он плавает в трубопроводе, как воздушный пузырь, занимая ресурсы, но не принося полезных результатов. Аппаратное обеспечение для обнаружения опасности данных и остановки конвейера до устранения опасности называется блокировка трубопровода.

Обходя назад во времениПроблема решена с помощью пузыря
Пересылка данных (двухэтапный, ошибка) .svgПересылка данных (двухэтапный) .svg

Однако блокировку конвейера не обязательно использовать при пересылке данных. Первый пример SUB с последующим И и второй пример LD с последующим И может быть решена путем остановки первого этапа на три цикла до тех пор, пока не будет достигнута обратная запись и данные в регистровом файле верны, что приведет к извлечению правильного значения регистра из Иэтап декодирования. Это приводит к значительному снижению производительности, так как процессор много времени тратит на то, чтобы ничего не обрабатывать, но тактовые частоты можно увеличить, так как логика пересылки меньше, чем нужно ждать.

Эту опасность для данных можно довольно легко обнаружить, когда машинный код программы написан компилятором. В Стэнфордский MIPS машина полагалась на компилятор, чтобы добавить инструкции NOP в этом случае, вместо того, чтобы иметь схему для обнаружения и (что более утомительно) остановки первых двух этапов конвейера. Отсюда и название MIPS: микропроцессор без взаимосвязанных этапов конвейера. Оказалось, что дополнительные инструкции NOP, добавленные компилятором, достаточно расширили двоичные файлы программы, что снизило частоту попаданий в кэш инструкций. Аппаратное обеспечение, хотя и дорогое, было возвращено в более поздние разработки, чтобы улучшить процент попаданий в кэш команд, после чего аббревиатура перестала иметь смысл.

Опасности контроля

Опасности управления вызваны условным и безусловным ветвлением. Классический конвейер RISC разрешает переходы на этапе декодирования, что означает, что повторение разрешения переходов длится два цикла. Есть три следствия:

  • Повторение разрешения ветвлений проходит через довольно много схем: чтение кэша инструкций, чтение файла регистров, вычисление условия ветвления (которое включает 32-битное сравнение на процессорах MIPS) и мультиплексор адреса следующей инструкции.
  • Поскольку цели перехода и перехода вычисляются параллельно чтению регистра, RISC ISA обычно не имеют инструкций, которые переходят к адресу регистр + смещение. Поддерживается переход к регистрации.
  • При любом предпринятом переходе инструкция сразу после перехода всегда выбирается из кэша инструкций. Если эта инструкция игнорируется, на каждую взятую ветвь приходится один цикл. МПК штраф, который достаточно велик.

Существует четыре схемы решения этой проблемы производительности с помощью ветвей:

  • Predict Not Taken: всегда получать инструкцию после перехода из кеша инструкций, но выполнять ее только в том случае, если переход не был выполнен. Если ответвление не занято, трубопровод остается заполненным. Если переход выполняется, инструкция сбрасывается (помечается, как если бы она была NOP), и возможность одного цикла завершить выполнение инструкции теряется.
  • Вероятность перехода: всегда извлекать инструкцию после перехода из кеша инструкций, но выполнять ее только в том случае, если переход был выполнен. Компилятор всегда может заполнить слот задержки ветвления в такой ветке, и, поскольку ветки выполняются чаще, чем нет, такие ветки имеют меньший штраф IPC, чем предыдущий тип.
  • Слот задержки ответвления: Всегда извлекать инструкцию после перехода из кэша инструкций и всегда выполнять ее, даже если переход выполняется. Вместо того, чтобы взимать штраф IPC за некоторую долю взятых ветвей (возможно, 60%) или неиспользованных (возможно, 40%), слоты задержки ветвления принимают штраф IPC для тех ветвей, в которых компилятор не может запланировать слот задержки ветвления. Разработчики SPARC, MIPS и MC88K разработали слот задержки перехода в свои ISA.
  • Прогнозирование ветвей: Параллельно с получением каждой инструкции угадывайте, является ли инструкция переходом или переходом, и если да, угадывайте цель. В цикле после перехода или перехода получить инструкцию в предполагаемой цели. Если предположение неверно, очистите неправильно выбранную цель.

Задержанные переходы вызывали споры, во-первых, из-за сложности их семантики. Отложенная ветвь указывает, что происходит переход в новое место. после следующая инструкция. Эта следующая инструкция неизбежно загружается кешем инструкций после перехода.

Задержанные ветки подверглись критике[кем? ] как плохой краткосрочный выбор в дизайне ISA:

  • Компиляторам обычно трудно найти логически независимые инструкции для размещения после перехода (инструкция после перехода называется слотом задержки), так что они должны вставлять NOP в слоты задержки.
  • Суперскаляр процессоры, которые выбирают несколько инструкций за цикл и должны иметь некоторую форму предсказания ветвлений, не получают преимуществ от отложенных ветвей. В Альфа ISA не учитывала отложенные переходы, так как была предназначена для суперскалярных процессоров.
  • Наиболее серьезным недостатком отложенных переходов является дополнительная сложность управления, которую они влекут. Если инструкция слота задержки принимает исключение, процессор должен быть перезапущен на ветви, а не на следующей инструкции. В этом случае исключения имеют по существу два адреса, адрес исключения и адрес перезапуска, и правильное их создание и различение во всех случаях было источником ошибок для более поздних разработок.

Исключения

Предположим, 32-битный RISC обрабатывает инструкцию ADD, которая складывает два больших числа, и результат не умещается в 32-битном формате. Что случилось?

Самое простое решение, предоставляемое большинством архитектур, - это арифметика с упаковкой. У чисел, превышающих максимально возможное закодированное значение, самые старшие биты обрезаются до тех пор, пока они не подходят. В обычной системе счисления 3000000000 + 3000000000 = 6000000000. При беззнаковой 32-битной арифметике обертывания 3000000000 + 3000000000 = 1705032704 (6000000000 mod 2 ^ 32). Это может показаться не очень полезным. Самым большим преимуществом арифметики обертывания является то, что каждая операция дает четко определенный результат.

Но программист, особенно если программирование на языке, поддерживающем большие целые числа (например. Лисп или же Схема ), может не захотеть обернуть арифметику. Некоторые архитектуры (например, MIPS) определяют специальные операции сложения, которые переходят в определенные места при переполнении, а не обертывают результат. Программное обеспечение в целевом местоположении отвечает за решение проблемы. Эта специальная ветвь называется исключением. Исключения отличаются от обычных переходов тем, что целевой адрес не указывается в самой инструкции, а решение о переходе зависит от результата инструкции.

Наиболее распространенный вид программно-видимого исключения на одной из классических RISC-машин - это TLB пропустить.

Исключения отличаются от ветвей и переходов, потому что эти другие изменения потока управления разрешаются на этапе декодирования. Исключения разрешаются на этапе обратной записи. Когда обнаруживается исключение, следующие инструкции (ранее в конвейере) помечаются как недопустимые, и по мере их продвижения к концу конвейера их результаты отбрасываются. Счетчик программы устанавливается на адрес специального обработчика исключений, а специальные регистры записываются с указанием местоположения и причины исключения.

Чтобы программное обеспечение могло легко (и быстро) решить проблему и перезапустить программу, ЦП должен принять точное исключение. Точное исключение означает, что все инструкции до инструкции исключения были выполнены, а инструкция исключения и все последующие не были выполнены.

Чтобы принимать точные исключения, ЦП должен совершить изменение видимого состояния программного обеспечения в порядке выполнения программы. Эта упорядоченная фиксация происходит очень естественно в классическом конвейере RISC. Большинство инструкций записывают свои результаты в регистровый файл на этапе обратной записи, и поэтому эти записи происходят автоматически в порядке выполнения программы. Однако инструкции Store записывают свои результаты в очередь данных Store на этапе доступа. Если инструкция сохранения принимает исключение, запись очереди данных сохранения становится недействительной, поэтому она не записывается в SRAM данных кэша позже.

Обработка промахов кеша

Иногда кэш данных или инструкций не содержит требуемых данных или инструкций. В этих случаях ЦП должен приостановить работу до тех пор, пока кэш не будет заполнен необходимыми данными, а затем должен возобновить выполнение. Проблема заполнения кеша необходимыми данными (и, возможно, обратной записи в память вытесненной строки кэша) не является специфической для организации конвейера и здесь не обсуждается.

Есть две стратегии решения проблемы приостановки / возобновления. Первый - это глобальный сигнал остановки. Этот сигнал, когда он активирован, предотвращает продвижение инструкций по конвейеру, как правило, за счет переключения часов на триггеры в начале каждого этапа. Недостатком этой стратегии является то, что существует большое количество триггеров, поэтому глобальному сигналу остановки требуется много времени для распространения. Поскольку машина обычно должна остановиться в том же цикле, в котором она определяет условие, требующее остановки, сигнал остановки становится критическим путем ограничения скорости.

Другая стратегия обработки приостановки / возобновления - повторное использование логики исключения. Машина выполняет исключение для ошибочной инструкции, и все дальнейшие инструкции становятся недействительными. Когда кэш заполнен необходимыми данными, инструкция, вызвавшая промах кеша, перезапускается. Чтобы ускорить обработку промахов кэша данных, инструкция может быть перезапущена, чтобы ее цикл доступа происходил через один цикл после заполнения кэша данных.

Рекомендации

  • Хеннесси, Джон Л .; Паттерсон, Дэвид А. (2011). Компьютерная архитектура, количественный подход (5-е изд.). Морган Кауфманн. ISBN  978-0123838728.
  1. ^ Паттерсон, Дэвид. "RISC I: компьютер СБИС с сокращенным набором команд". Цитировать журнал требует | журнал = (помощь)
  2. ^ Паттерсон, Дэвид. "RISC I: компьютер СБИС с сокращенным набором команд". Цитировать журнал требует | журнал = (помощь)