Простая конвейерная и суперскалярная архитектура
Рассмотрим эту схему потока команд....
выборка инструкции-> декодирование инструкции-> выборка операндов-> выполнение инструкции-> обратная запись
предположим, процессор, который поддерживает
и cisc и risc... как intel 486
Теперь, если мы выдадим команду risc, для ее выполнения потребуется один тактовый цикл, и, таким образом, проблем не будет... но если будет выдана команда cisc, ее выполнение займет время...
так что пусть для выполнения инструкции cisc требуются три такта, а каждый такт - на этапы, предшествующие выполнению....
теперь в суперскалярной структуре две инструкции, выданные во время обработки первой, перенаправляются в другие доступные функциональные блоки... но при простой конвейеризации такое отклонение невозможно, так как для выполнения инструкций доступен только один функциональный блок...
так что же позволяет избежать скопления инструкций в простом конвейерном случае?
1 ответ
Технически говоря, x86 не является процессором RISC. Это процессор CISC. Есть инструкции, которые занимают меньше времени, но это не инструкции RISC. Я считаю, что Intel внутренне превращает инструкции в инструкции RISC, но это на самом деле не актуально.
Если у нас есть инструкции, которые занимают разное время, то это становится процессором CISC. Практически невозможно передать процессор CISC - насколько мне известно, никто этого не делал. Есть много вещей, которые вы можете сделать внутри самого ЦПУ, чтобы ускорить выполнение, например, выполнение вне очереди. Таким образом, вы не можете получить перегруженность конвейера, потому что все инструкции должны выполняться последовательно.
Теперь, если мы выдадим команду risc, для ее выполнения потребуется один тактовый цикл, и, таким образом, проблем не будет... но если будет выдана команда cisc, ее выполнение займет время...
Инструкция RISC не обязательно занимает один тактовый цикл. На MIPS это занимает 5. Тем не менее, смысл конвейерной обработки состоит в том, что после выполнения одной инструкции следующая инструкция завершит один тактовый цикл после завершения текущей.
теперь в суперскалярной структуре две инструкции, выпущенные во время обработки первой, перенаправляются в другие доступные функциональные единицы...
В суперскалярной архитектуре две инструкции выполняются и завершаются одновременно. В чисто суперскалярной архитектуре цикл выглядит следующим образом (F = выборка, D = декодирование, X = eXecute, M = память, W = обратная запись):
(inst. 1) F D X M W
(inst. 2) F D X M W
(inst. 3) F D X M W
(inst. 4) F D X M W
но в простой конвейерной обработке такое отклонение невозможно, так как для выполнения инструкций доступен только один функциональный блок.
Правильно, поэтому цикл выглядит так:
(inst. 1) F D X M W
(inst. 2) F D X M W
(inst. 3) F D X M W
(inst. 4) F D X M W
Теперь, если у нас есть инструкции, которые занимают различное количество времени (компьютер CISC), это сложнее для конвейера, потому что есть только один исполнительный блок, и нам, возможно, придется ждать, пока предыдущая инструкция завершит выполнение. Инструкция 1 занимает 2 цикла выполнения, инструкция 2 - 5, инструкция 3 - два, а инструкция 4 - только один в этом примере.
(inst. 1) F D X X M W
(inst. 2) F D X X X X X M W
(inst. 3) F D X X M W
(inst. 4) F D X M W
Таким образом, мы не можем реально конвейеризовать процессоры CISC - мы должны дождаться завершения цикла выполнения, прежде чем мы сможем перейти к следующей инструкции. Мы не должны делать это в MIPS, потому что он может определить, является ли инструкция ветвью и местом назначения в фазе декодирования.