Сколько тактов требуется для выполнения инструкции RISC / CISC?

13

Согласно « Цифровому дизайну и компьютерной архитектуре » Харриса и Харриса, существует несколько способов реализации процессора MIPS, включая следующие:

Микроархитектуры за один цикл выполняет всю команду в одном цикле. (...)

В многорежимный микроархитектуры выполняет инструкции в серии коротких циклов. (...)

Конвейерный микроархитектуры прикладывает конвейер к микроархитектуре однотактной.

Архитектуры часто классифицируются как RISC или CISC. От RISC против CISC :

Процессоры RISC используют только простые инструкции, которые могут быть выполнены за один такт.

Поскольку MIPS - это RISC-архитектура, меня немного смущают вышеприведенные определения, и я удивляюсь, нет ли между ними какого-то противоречия. Более конкретно:

  1. Если команду RISC можно разбить на более короткие циклы (Fetch, Decode, ...), как мы можем сказать, что для выполнения всей инструкции требуется всего один такт? Разве не требуется один такт для выполнения каждого из шагов?
  2. Действительно ли требуется один такт для выполнения одной инструкции RISC? Что произойдет, например, если произойдет потеря кэша и процессор будет ждать медленной DRAM? Разве это не должно немного продлить выполнение инструкции?
  3. Что такое один цикл инструкций? Это время, которое требуется для завершения одной инструкции (т.е. один / несколько тактов)?
  4. Сколько времени занимает одна инструкция CISC в тактах / циклах инструкций?

источник
2
Обычно не менее одного :-).
Рассел МакМэхон

Ответы:

22

Практические определения RISC и CISC настолько размыты и размыты, что теперь они почти бессмысленны. Теперь лучше думать о них как о «философии» в том смысле, что архитектура CISC имеет более богатый набор команд с более мощными индивидуальными инструкциями (например, DIV и т. П.), В то время как набор команд RISC прост и быстр, и оставляет это компилятору для реализации сложных операций. Даже якобы наборы команд CISC (например, x86) переводятся во внутренние инструкции в микросхемах Intel и AMD и реализуются скорее как процессоры RISC. Чтобы ответить на ваши вопросы:

  1. Оригинальные академические процессоры RISC (и я думаю, возможно, самые первые коммерческие версии) действительно выполняли одну инструкцию за цикл, включая выборку и декодирование. Это стало возможным, потому что каналы данных были очень чистыми, потому что операции на каждой стадии были простыми и четко определены. (компромисс здесь только очень простые инструкции могут быть реализованы таким образом). Как только он попал в реальный мир, все стало размытым. Такие вещи, как конвейерная обработка и суперскалярная архитектура, делают невозможной простую дихотомию RISC / CISC.

  2. Исходные чипы RISC пытались выполнить одну инструкцию за цикл, и они могли, если данные были доступны в файле регистра. Конечно, если бы процессор перешел на DRAM, это заняло бы (много) больше времени. RISC - это «попытка» выполнить инструкцию за цикл.

  3. Один цикл инструкций - это время, которое требуется между выборками.

  4. В значительной степени зависит от инструкции и архитектуры набора команд. Даже в архитектуре CISC некоторые инструкции могут выполняться очень быстро (например, сдвиг влево или вправо). Некоторые выполняются очень медленно (10 с или более циклов). Архитектура VAX (возможно, вершина философии CISC) имела действительно сложные инструкции. Между прочим, архитектуру CISC обычно проще программировать на ассемблере, чем архитектуру RISC, потому что она почти как язык высокого уровня!

crgrace
источник
5

Краткий ответ

  1. Этапы декодирования и выполнения инструкции выполняются параллельно со следующим этапом предыдущей инструкции. Этот метод известен как конвейерная обработка. См. О процессорах RISC ниже.

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

  3. Цикл инструкции - это время, необходимое для выполнения инструкции. Это зависит от архитектуры и (в некоторых случаях) инструкций. Например, большинство инструкций для MIPS R2000 / 3000 занимает один цикл. Инструкции, касающиеся доступа к памяти (загрузка / сохранение, ветвление), занимают более одного цикла, хотя слоты задержки означают, что вы можете выполнить что-то еще (возможно, просто NOP) в слоте задержки. В неконвейерных архитектурах могут быть циклы команд, состоящие из нескольких тактов, которые часто зависят от режима адресации. См. О процессорах RISC, традиционных архитектурах CISC и аппаратных архитектурах ниже.

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

  4. Процессоры CISC могут иметь инструкции, которые занимают разную продолжительность. Точное количество тактов зависит от архитектуры и инструкций. Различное количество тактов, используемых в CISC ISA, является одной из причин, по которой их сложно встроить в сильно конвейерные архитектуры. См. Традиционные архитектуры CISC ниже.

Чем дольше ответ

Для одного выпуска MIPS, SPARC или другого ЦП все (для первого приближения) команды выдают за один цикл, хотя они могут иметь то, что называется «интервалом задержки».

На процессорах RISC

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

Большинство старых RISC-процессоров имеют единый дизайн, и эти типы до сих пор широко используются во встроенных системах. 32-разрядное целочисленное RISC-ядро с одним выпуском может быть реализовано в пределах 25 000–30 000 шлюзов, поэтому ядра этого типа имеют очень низкое энергопотребление и очень малую площадь. Это позволяет легко и дешево их интегрировать в продукты SOC (система-на-кристалле).

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

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

Например, в конструкции SPARC V7 / V8 следующая инструкция после ветвления фактически выполняется до того, как произойдет сама ветвь. Обычно вы помещаете NOP в слот после ветки, но вы можете поместить в него другую инструкцию, если сможете найти что-то полезное для выполнения.

Архитектура MIPS R2000 / R3000 имела аналогичный интервал задержки в инструкциях загрузки / сохранения. Если вы загрузили значение из памяти, оно фактически не появилось бы в регистре для другого цикла. Вы можете поместить NOP в слот или сделать что-то еще, если сможете найти что-то полезное, что не зависит от только что выполненной вами операции загрузки.

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

Традиционные процессоры CISC

Процессоры CISC были проектами, которые могли иметь инструкции, занимающие различную продолжительность времени. Часто у них были более сложные инструкции, реализованные непосредственно в оборудовании, которые должны были бы быть выполнены в программном обеспечении на процессоре RISC.

Большинство архитектур мэйнфреймов и почти все конструкции ПК до M68K и Intel 386 были традиционными микрокодированными процессорами CISC. Эти конструкции оказались медленнее за такт и использовали больше гейтов, чем процессоры RISC.

Microcode

Пример микрокодированной архитектуры (MOS 6502) можно увидеть в эмуляции здесь . Микрокод можно увидеть в верхней части изображения.

Микрокод контролирует потоки данных и действия, активируемые в ЦПУ для выполнения инструкций. Зацикливая шаги в микрокоде, вы можете активировать части CPU, перемещать данные через ALU или выполнять другие шаги. Компоненты многократного использования в ЦП могут быть скоординированы в течение нескольких тактов для выполнения инструкции. В случае 6502 некоторые конвейерные действия также могут выполняться микрокодом.

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

Зашитые архитектуры

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

Известным примером этого был оригинальный процессор Amdahl 470/6 , который был заменой центрального процессора на некоторых моделях IBM System / 370. Процессор Amdahl был аппаратно спроектирован в то время, когда 370 процессоров IBM были сильно основаны на микрокоде. Процессор Amdahl был примерно в 3 раза быстрее, чем процессоры IBM, которые они заменили.

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

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

Проекты с несколькими выпусками

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

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

Современные Intel и другие x86 / X64 ISA-процессоры имеют уровень, который интерпретирует набор инструкций CISC старой школы в микро-инструкции, которые могут передаваться через конвейерное ядро ​​RISC-стиля с несколькими выпусками. Это добавляет некоторые накладные расходы, которых нет на процессорах с ISA, которые предназначены для конвейерной обработки (то есть архитектуры RISC, такие как ARM или PowerPC).

VLIW дизайн

Проекты VLIW, из которых Intel Itanium , пожалуй, самый известный, никогда не принимались за господствующую архитектуру, но в IIRC существует ряд архитектур DSP, в которых используется этот тип проектирования. Проект VLIW делает явным множественный выпуск со словом инструкции, содержащим более одной инструкции, которая выдается параллельно.

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

Архитектуры VLIW работают достаточно хорошо для числовых приложений, поскольку операции с матрицами / массивами, как правило, предлагают возможности для широкого параллелизма. Некоторое время у Itanium была ниша на рынке суперкомпьютерных приложений, и по крайней мере одна суперкомпьютерная архитектура - Multiflow TRACE - была разработана с использованием ISA этого типа.

Память и кеширование

Современные ЦП намного, намного быстрее, чем память, поэтому прямое чтение из памяти может генерировать сотни состояний ожидания, которые блокируют ЦП до завершения доступа к памяти. Кэширование, которое теперь выполняется в несколько слоев, содержит последние использованные области памяти в кеше. Поскольку центральные процессоры обычно проводят большую часть времени, выполняя код в циклах, это означает, что вы получаете хорошие показатели повторного использования областей памяти, которые вы недавно использовали. Это свойство называется «местность ссылки».

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

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

ConcernedOfTunbridgeWells
источник
3

Это упрощение для студентов.

Каждый нетривиальный процессор конвейерен. В одном конце имеется блок предварительной загрузки, выполняющий операции по смещению инструкций, несколько исполнительных блоков в середине, выполняющих фактическую работу, и блок выдачи, отвечающий за объявление инструкций, выполненных после завершения записи в регистр или памяти. Если имеется несколько исполнительных блоков (скажем, целочисленный ALU, ALU с плавающей запятой и векторный блок), может быть возможно выпустить (иногда называемый «списать») несколько инструкций за такт. Как процессор может доставлять более одной инструкции за цикл? подробнее расскажу об этом.

Как вы говорите, что, если есть задержка пропадания кэша? Intel Hyperthreading является новым решением для этого: два набора регистров состояния ЦП, одна логика управления и блоки выдачи. Как только один виртуальный процессор остановится, перейдите в состояние другого. (это само грубое упрощение)

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

(Конкретный ответ на вопрос «Сколько времени занимает одна инструкция CISC в тактах / циклах инструкций?» - «посмотрите в справочном руководстве производителя, и у него будет время для каждой инструкции»)

pjc50
источник
0

Другие парни написали много хороших материалов, поэтому я буду кратким ответом: в старые времена (здесь 1980-е годы) считались 8-битные процессоры дня (6800, 6502, Z80, 6809 и другие). CISC. Некоторые инструкции могли выполняться за 2 такта, но это были простые инструкции, такие как установка / очистка битов флага в регистре состояния процессора. Другие инструкции могут занять от 2-6 и даже до 9 тактов. У этих процессоров было несколько довольно мощных инструкций, у Z80 были некоторые инструкции по очистке блоков памяти, которые записывали бы одно и то же значение в серию байтов в памяти, эффективно очищая большой блок в одной инструкции, просто устанавливали несколько регистров и выполняли Инструкция LDIR (загрузка, приращение и повтор).

Процессор 6502 (из памяти) имел 56 команд, но 13 режимов адресации создавали мощный набор команд.

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

Если я правильно помню, первая попытка архитектуры RISC была либо транспьютером, либо процессором Acorn Risc?

декан
источник
Возможно, первой конвейерной архитектурой типа RISC был CDC 6600, разработанный Seymour Cray. Это было за пару десятилетий до того, как термин RISC получил широкое распространение. MIPS, ARM и несколько других микропроцессорных разработок RISC восходят к периоду 1980-1985 годов, когда первые коммерческие аппаратные средства, использующие эти чипы, появились примерно в середине 1980-х годов.
ConcernedOfTunbridgeWells
Отдельные транспьютерные микросхемы были довольно быстрыми, но не были того типа архитектуры, который обычно ассоциируется с микросхемой RISC. en.wikipedia.org/wiki/Transputer#Architecture
ConcernedOfTunbridgeWells
У меня есть пара транспьютеров в антистатическом корпусе, просто часть исторической коллекции микропроцессоров. Никогда не использовал их, было бы очень весело в те дни экспериментировать с ними.
Декан
@ConcernedOfTunbridgeWells Я только что посмотрел на набор команд CDC 6600. В то время как дизайн, кажется, воплощает (и предвидит) некоторые принципы RISC, инструкция деления с плавающей запятой занимает 29 циклов! И само включение инструкции деления противоречит типичным принципам RISC, но спасибо за очень интересный комментарий!
Cgracece
Основными атрибутами RISC-ish были конвейерный механизм выборки / декодирования / выполнения команд и архитектура хранения нагрузки (то есть отсутствие режимов адресации с неявным доступом к памяти для вычисления адреса). Фактически, некоторые наборы команд RISC (например, IBM POWER) на самом деле довольно велики, но все еще используют подход загрузки / хранения для обеспечения согласованного времени выполнения.
ConcernedOfTunbridgeWells