Опасность данных в MIPS при выполнении ADD и SW с одинаковыми регистрами? - PullRequest
0 голосов
/ 30 марта 2020

MIPs Datapath Im ссылается на Допустим, у нас есть программа сборки MIPs с 5-этапной конвейерной передачей IF / ID / EXE / MEM / WB без пересылки, и все инструкции go выполняются на каждом этапе, даже если это может не дать значимых результатов:

...
add $t0, $s1, $s0
sw  $t0, 0($s2)
...

Существует ли опасность данных RAW? Мой текущий мыслительный процесс таков: $ t0 <- $ s1 + $ s0 mem [0 + $ s2] <- $ t0 Тогда это <strong>Read After Write , потому что сначала мы записываем в $ t0 (при добавлении), а затем читаем $ t0, чтобы поместить его в память. Кроме того, когда SW находится в ID, ADD выполняет добавление на этапе ALU / EXE. Таким образом, фаза ID SW извергает значение $ t0, прежде чем ADD сможет записать результат обратно. Я знаю, что есть похожий вопрос: Есть ли опасность MIPS для хранения данных в хранилище? но мой случай очень конкретен c, и это мне не сильно помогло, потому что он предполагал, что инструкции могут выполняться без использования некоторых этапов.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Да, конечно, есть опасность RAW. Одна инструкция читает результат предыдущей инструкции, разделенная на много меньше длины конвейера. Википедия: https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Data_hazards

Опасность данных возникает, когда инструкция, запланированная вслепую, будет пытаться использовать данные до того, как данные будут доступны в файле регистра.

Классический c коммерческий MIPS, такой как R2000, имеет обходную переадресацию и не должен останавливаться , потому что его логика переадресации c обнаруживает опасность (которая все еще существует ) и перенаправляет результат EX из add в мультиплексор для чтения регистра для sw. Таким образом, если мы перейдем к остальной части конвейера, эта инструкция будет иметь перенаправленное значение $t0 и значение файла реестра $s2. https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_A ._ Обход

Без обходной переадресации, да, вам действительно придется остановиться. Предполагая, что SW все еще считывает оба входных операнда из файла регистров в обычное время, на этапе ID. IDK, если возможно, что вы могли бы позволить магазинам читать их регистр данных поздно (в начале состояния MEM), чтобы уменьшить количество циклов задержки на 1, но для этого может потребоваться дополнительный порт чтения в файле реестра, поскольку этап идентификации может также читайте 2 инструкции.

Ваш конвейер все еще должен обнаружить опасность и иметь возможность ее остановить (https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_B ._ Pipeline_interlock ). Эффективная задержка простых инструкций ALU хуже 1 цикла довольно ужасна, поэтому все реальные конвейеры RIS C выполняют переадресацию вместо того, чтобы просто обнаруживать и останавливать. Компиляторы имеют достаточно жесткий код планирования времени для заполнения интервалов задержки загрузки и задержки без необходимости скрывать задержку для каждой простой инструкции ALU!

0 голосов
/ 30 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...