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

#cpu-architecture #branch-prediction

#cpu-architecture #прогнозирование ветвления

Вопрос:

Речь идет о примере из раздела 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 инструкцию в первом полупериоде, а затем решает не выдавать следующую инструкцию во втором полупериоде? Это только мое предположение. Никакой связанной информации я не нашел в книге.

Ответ №1:

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

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

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


re: реализация: декодеры параллельны, а не первый и 2-й полупериоды.

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

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