stringtranslate.com

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

В истории компьютерного оборудования некоторые ранние центральные процессоры компьютеров с сокращенным набором команд (RISC CPU) использовали очень похожее архитектурное решение, теперь называемое классическим 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 записи.

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

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

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

Выполнять

На этапе «Выполнение» происходят фактические вычисления. Обычно этот каскад состоит из АЛУ и битового переключателя. Он также может включать в себя многократный умножитель и делитель.

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

Бит-шифтер отвечает за сдвиг и вращение.

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

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

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

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

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

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

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

Опасности

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

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

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

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

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

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

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

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

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

СУБ r3 , r4 -> r10 ; Записывает r3 - r4 в r10 И r10 , r3 -> r11 ; Записывает r10 и r3 в r11.        

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

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

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

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

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

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

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

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

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

LD adr -> r10 И r10 , r3 -> r11      

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

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

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

Эту угрозу данным можно довольно легко обнаружить, когда машинный код программы пишется компилятором. В этом случае машина 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: Компьютер VLSI с сокращенным набором команд». Иска '81. стр. 443–457.
  2. Паттерсон, Дэвид (12 мая 1981 г.). «RISC I: Компьютер VLSI с сокращенным набором команд». Иска '81. стр. 443–457.