2015-11-26 7 views
2

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

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

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

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

+0

@harold: У меня возникает соблазн отбросить последнее изменение по этой причине.Искушение слишком сильное, я вернулся к предыдущей версии. Если махмуд хочет получить ответ на свой новый вопрос, он может просто задать новый вопрос о SO. –

+0

Сначала я попросил часть упражнения и получил ответ, который был повторным, но мой был другим. Позже я увидел, что ответ не применим ко второй части упражнения. Итак, я заменил это ... Если я сделал не так, я должен сказать, извините ... – mahmood

ответ

2

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

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


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

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

Кроме того, для (a) я не вижу ВОЙН на 6 долларов США от I1 до I3. Вы??

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

+0

Что касается вашей фразы «SW не записывается в регистр, так что это не имеет значения, но ADD не может выполнить перед этим», но мы можем сделать это в стандартном 5-этапном конвейере для двух независимых инструкций. Правильно? Здесь обе команды работают в одном регистре, но в целом с 5-ступенчатым конвейером я могу написать четвертую инструкцию, которая работает с другими регистрами, и мы видим, что она будет закончена еще до добавления. Согласны ли вы с этим? – mahmood

+0

Я имею в виду диаграмму 'IF ID - - EX MEM WB' и' IF ID EX MEM WD' для самостоятельной инструкции. Как вы можете видеть, вторая команда заканчивается до первой. Разве мы нарушили правило заказа? – mahmood

+0

@mahmood, но вы не можете вызвать такую ​​ситуацию. Каждый раз, когда вы вставляете пузырь, вы также удерживаете следующую инструкцию (ы). Эта вторая инструкция не может «идти первым», аппаратное обеспечение, которое могло бы сделать это, просто не в стандартном конвейере – harold