Сколько инструкций нужно убить при неправильном прогнозировании в 6-ступенчатой ​​скалярной или суперскалярной MIPS? - PullRequest
3 голосов
/ 21 марта 2020

Я работаю над конвейером с 6 этапами: FDI X0 X1 W. Меня спрашивают, сколько инструкций нужно убить, когда произойдет непредвиденное ветвление.

Я придумал 4. I Подумайте об этом, потому что разрешение ветвления происходит в X1, и нам нужно будет убить все инструкции, которые пришли после ветки. На диаграмме конвейера, похоже, потребуется 4 команды, которые находятся в процессе прохождения по конвейеру. Это верно?

Меня также спрашивают, сколько нужно убить, если конвейер является суперскалярным в ширину. В этом я не уверен. Я думаю, что это будет 12, потому что вы можете получить 3 инструкции за один раз. Это правильно?

1 Ответ

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

убить все инструкции, которые пришли после ветки

Нет, если это настоящий MIPS. MIPS имеет один интервал задержки ветвления : инструкция после ветвления всегда выполняется независимо от того, взята ветвь или нет. (Обратный адрес jal - это конец интервала задержки, поэтому он не выполняется дважды.)

Этого было достаточно, чтобы полностью скрыть 1 цикл задержки ветвления в classi c MIPS I ( R2000), в котором использовался скаляр classi c RIS C 5-ступенчатый конвейер . Он справился с этой задержкой на 1 тактовую ветвь путем пересылки из первой половины тактового цикла EX на IF, начинающийся во 2-й половине тактового цикла . Вот почему условия ветвления MIPS являются «простыми» (не требуют переноса через целое слово), как beq между двумя регистрами, но только один операнд bgez / bltz против неявного 0 для подписано 2 дополнения сравнения. Для этого нужно только проверить знаковый бит.

Если бы ваш конвейер был хорошо спроектирован, вы могли бы ожидать, что он разрешит ответвления после X0, потому что MIPS ISA уже ограничен, чтобы облегчить принятие решения о ветвлении с малой задержкой. ALU. Но, очевидно, ваш конвейер не оптимизирован, и решения о ветвях не готовы до конца X1, что противоречит цели заставить его запускать код MIPS вместо RIS C -V или любого другого набора команд RIS C.


Я придумал 4. Я думаю, что это потому, что разрешение ветвления происходит в X1, и нам нужно будет убить все инструкции, которые пришли после ветки.

Я думаю, что 4 цикла выглядят правильно для обобщенного c скалярного конвейера без слота задержки ветвления.

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

(Если не было пропуска I-кэша при получении команды интервала задержки, в этом случае команда интервала задержки может даже не быть пока в конвейере. Так что это не так просто, как убить 3 этапа до X0 или даже убить все, кроме самой старой предыдущей инструкции в конвейере. Слоты задержки не свободны для реализации, что также усложняет обработку исключений.)

Таким образом, инструкции 0..3 должны быть уничтожены на этапах конвейера от F до I. (Если возможно, чтобы инструкция интервала задержки находилась на одном из этих этапов, вы должны обнаружить этот особый случай. Если это не так Например, задержка пропадания I-кэша достаточно велика, чтобы он либо находился в X0, либо все еще ожидал извлечения, тогда конвейер может просто убить эти первые 3 этапа и сделать что-то на основе X0, являющегося пузырем или нет.)


Я думаю, что это будет 12, потому что вы можете получить 3 инструкции за один раз

Нет. Помните, что сама ветвь является одной из группы из 3 инструкций, которые могут go пройти по конвейеру . В случае непредсказуемости, предположительно, этап декодирования отправил бы все 3 команды в этой группе извлечения / декодирования по конвейеру.

Худший случай, я думаю, когда ветвь является первой (самая старая в программный порядок) обучение в группе. Затем необходимо убить 1 (или 2 без слота задержки перехода) из этой группы в X1, а также все инструкции на предыдущих этапах. Затем (при условии отсутствия пузырьков) вы отменяете 13 (или 14) инструкций, по 3 на каждом предыдущем этапе.

Наилучший случай - это когда ветвь является последней (самой младшей в программном порядке) в группе из 3 человек. Затем вы отбрасываете 11 (или 12 без слота задержки).

Таким образом, для версии этого конвейера с шириной 3 без слота задержки, в зависимости от пузырьков на предыдущих стадиях конвейера, вы уничтожение 0..14 инструкций, которые уже находятся в конвейере.

Реализация слота задержки отстой; есть причина, по которой новые ISA не раскрывают детали этого конвейера. Долгосрочная боль для кратковременного усиления.

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