В примере ЦП с несколькими проблемами в учебнике, почему инструкция после инструкции ветвления должна ждать один цикл перед выдачей?

Пример приведен в разделе 3.8 Использование ILP с использованием динамического планирования, множественных проблем и предположений книги Архитектура компьютера — количественный подход.

Учитывая динамическое планирование, процессор с двумя задачами и код сборки, указанный ниже (он по существу увеличивает каждый элемент массива)

Loop: LD      F2,0(R1)
      DADDIU  R2,R2,#1
      SD      R2,0(R1)
      DADDIU  R1,R1,#8
      BNE     R2,R3,LOOP

затем книга показывает время выпуска, исполнения и результат записи на рисунке 3.19: введите здесь описание изображения

Мой вопрос: почему LD R2,0(R1) итерации 2 выдается в четвертом цикле, а не в том же цикле с BNE? Я могу понять, почему LD следует выполнить позже, но я понятия не имею, почему выпуск также должен быть отложен.

Дополнительный вопрос: как это реализовано (обнаружить инструкцию BNE, а затем отложить следующую инструкцию), учитывая, что две инструкции могут выполняться в одном и том же цикле? Может быть, процессор находит входящую инструкцию BNE в первом полупериоде, а затем решает не выдавать следующую инструкцию во втором полупериоде? Это только мое предположение. Никакой соответствующей информации я не нашел в книге.


person cyanbuckeye    schedule 27.11.2020    source источник


Ответы (1)


Подпись к рисунку уже пытается объяснить это: обработка ветвления выборки/декодирования не имеет способа получить цель ветвления в том же цикле, в котором она выбирает саму ветвь.

У вас мог бы быть ЦП с более широким этапом выборки/декодирования и буферизацией между этапами для поглощения пузырей из взятых ветвей, но у этого ЦП этого нет.

(Но другая проблема заключается в том, что даже если бы вы могли выдать обе инструкции, этот ЦП не выполняет спекулятивное выполнение; у него нет механизма для отбрасывания ld, если предсказание ветвления о том, что bne было выполнено, оказалось неверным. Поэтому он не может отправьте ld исполнительным модулям до тех пор, пока не проверите (с помощью исполнительного модуля), что bne занято.)


относительно реализации: декодеры параллельны, а не первый и второй полупериод.

Второй декодер уже должен проверить наличие опасностей, таких как зависимость данных между двумя инструкциями, и превратить вторую инструкцию в NOP.

Я предполагаю, что если первая инструкция является ветвью, она мультиплексирует второй слот инструкции в NOP вместо того, что было декодировано. Нет необходимости в том, чтобы это было синхронно и происходило на границе половины цикла.

person Peter Cordes    schedule 27.11.2020