#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 вместо того, что было декодировано. Нет необходимости, чтобы это было синхронно и происходило на границе «полупериода»