Язык MIPS, чтобы избежать трубопровода

Что касается языка ассемблера MIPS, который описан в книге Паттерссона, у меня есть вопрос с вставкой NOP между инструкциями, чтобы избежать остановок конвейера.

Рассмотрим следующий код

lw   $s5, -16($s5)
sw   $s5, -16($s5)
add  $s5, $s5, $s5

Мы видим, что существует опасность RAW за $s5 между lw а также sw, Существует также опасность WAW за $s5 между sw а также add, Таким образом, мы должны вставить две NOP, чтобы избежать сбоев. Другими словами, конвейерная диаграмма

lw      IF     ID     EX     MEM     WB
sw             IF     ID     ---     EX     MEM     WB
add                   IF     ID      EX     MEM     --     WB

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

Таким образом, модифицированный код

lw
NOP
sw
NOP
add

Но решение предлагает следующий код

lw
NOP
NOP
sw
add

Который правильный? Я думаю, что мой!

1 ответ

Решение

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

Ваше решение для опасности RAW предполагает, что существует перенаправление WB->EX, которого, судя по их решению, нет. Без пересылок результат можно использовать быстрее всего, когда идентификатор инструкции чтения совпадает с WB инструкции записи.


Почему (WB) и (EX) не выполняются за один цикл?

Потому что это не работает. Это не работает под вопросом a либо я не уверен, что там произошло. Суть вопроса заключается в том, что пересылка в EX отсутствует, так же, как и раньше, самое быстрое, что вы можете использовать после того, как оно получено, - это когда вы выровняете идентификатор инструкции чтения с WB инструкции записи. EX просто читает свои входные данные из регистра конвейера ID/EX.

Кроме того, для (a) я не вижу никакой WAR на 6 $ от I1 до I3. Вы??

Нет, поскольку ни I1, ни I3 не модифицируют $6, никакой опасности быть не может. RAR не является опасностью.

Другие вопросы по тегам