stringtranslate.com

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

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

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

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

Базовый пятиступенчатый конвейер в машине RISC (IF = Instruction Fetch , ID = Instruction Decode, EX = Execute, MEM = Memory Access, WB = Register write back). Вертикальная ось — последовательные инструкции; горизонтальная ось — время. Таким образом, в зеленом столбце самая ранняя инструкция находится на этапе WB, а последняя инструкция проходит этап выборки инструкций.

Инструкция по выборке

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

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

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

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

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

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

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

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

Выполнять

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

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

Сдвиговое устройство битов отвечает за сдвиг и вращение.

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

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

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

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

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

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

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

Опасности

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

LD адрес -> r10 И r10 , r3 -> r11      

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

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

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

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

Контролировать опасности

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

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

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

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

Исключения

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

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

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

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

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

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

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

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

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

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

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

Смотрите также

Ссылки

  1. Паттерсон, Дэвид (12 мая 1981 г.). «RISC I: СБИС-компьютер с сокращенным набором команд». Isca '81. С. 443–457.
  2. Паттерсон, Дэвид (12 мая 1981 г.). «RISC I: СБИС-компьютер с сокращенным набором команд». Isca '81. С. 443–457.