Количество NOPS для инструкции филиала в MIPS - PullRequest
1 голос
/ 23 февраля 2020

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

add $t1, $t2, $t3
sub $t4, $t1, $t0

Существует опасность данных из-за $t1. В конвейерном процессоре без блока обнаружения опасности для данных до того, как обновленное значение $t1 будет записано обратно в регистр, подинструкция использует старое значение, то есть опасность для данных. Если мы добавим 2 NOPS, тогда мы сможем решить эту проблему или, если есть модуль обнаружения опасности для данных, мы можем переслать результат fo $t1 после фазы выполнения.

Однако что если у нас есть инструкция перехода ? Например:

add $t1, $t2, $t3
beq $t0, $t1, Label

Мы также добавляем сюда 2 NOPS, если не можем использовать переадресацию?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

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

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

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

0 голосов
/ 24 февраля 2020

Очень сложно однозначно ответить без дополнительных подробностей об архитектуре. И там так много вариантов архитектуры mips.

Но сначала взгляните на свои претензии

add $t1, $t2, $t3
sub $t4, $t1, $t0

Существует опасность данных из-за $ t1 ...

Right

Если мы добавим 2 NOPS, мы сможем решить эту проблему

Не совсем. Без какого-либо среднего значения пересылки данных, с одной NOP, новый $ t1 будет в регистрах MM / WR конвейера, а со вторым NOP он будет записан обратно в банк регистров. Но не к трубопроводу DI / EX рег. Таким образом, чтобы получить правильное поведение только с двумя NOPS, вам нужно либо средство для пересылки данных, записанных обратно в банк регистров, в регистры DI / EX, либо использовать трюки, такие как запись на переднем крае часов для банка регистров и чтение это во второй части цикла.

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

Относительно ветви В инструкции есть несколько способов их реализации.

Наиболее очевидный способ - использовать стадию EX для одновременного вычисления условия ($ t0 =? $ T1) с ALU и адреса ветви с дополнительным сумматором. Но у него есть главный недостаток: пока выполняется это вычисление, этап LI извлекает новую инструкцию (а одна уже находится на этапе декодирования), что приводит к штрафу за переход в 2 цикла.

Что было сделано в конвейер classi c mips состоит в том, что ветви были обработаны на этапе декодирования. На этом этапе сумматор вычисляет адрес ветвления с помощью ПК + непосредственно, и был добавлен выделенный компаратор для непосредственного сравнения выходных данных банка регистров (кстати, по этой причине у вас могут быть только сравнения eq / neq для инструкций ветвления, чтобы упростить этот компаратор, в то время как компаратор ALU может делать другие виды сравнения). Таким образом, штраф за переход составляет всего один цикл.

Если мы предположим, что это ваша фактическая архитектура и что у нас нет средств переадресации, кроме банка регистров, то достаточно одного NOP. После одного NOP новое значение $ t1 находится в регистрах конвейера MEM / WR. А в следующем цикле он будет записан обратно в банк регистров в течение первой половины цикла и может быть использован для сравнения ветви во второй половине цикла.

Конечно, если вы предполагаете, что филиал обрабатывается на этапе EX (и если у вас есть штраф за ветвление в 2 цикла), тогда требуется второй NOP.

...