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

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

Есть ли опасность для данных RAW? Мой нынешний мыслительный процесс таков, поскольку:
$ t0 <- $ s1 + $ s0
mem [0 + $ s2] <- $ t0

Тогда это будет Чтение после записи , потому что мы сначала записываем в $ t0 (при добавлении), а затем читаем $ t0, чтобы поместить его в память. Кроме того, когда SW имеет ID, ADD выполняет добавление на этапе ALU / EXE. Таким образом, фаза ID SW возвращает значение $ t0 до того, как ADD сможет записать результат обратно.

Знаю, есть похожий вопрос: Существует ли опасность выполнения данных хранилища в MIPS?
но мой случай очень специфичен, и это мне не очень помогло, потому что он предположил, что инструкции могут выполняться без использования некоторых этапов.

0
iv9eni 30 Мар 2020 в 05:24

2 ответа

Лучший ответ

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

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

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

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

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

0
Peter Cordes 30 Мар 2020 в 02:48

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

0
Erik Eidt 30 Мар 2020 в 02:41