Язык 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 не является опасностью.