Компьютерная организация - как работает прогнозирование ветвления с учетом (всегда)?

Я могу понять, как работает «предсказание непринятого». Он просто переходит к загрузке инструкции ПК + 4. Пока ветвление не будет разрешено, если ветвление занято, то сбрасывает все инструкции, полученные ранее.

Но я не понимаю, как работает "предсказание взятого". Я думаю, что инструкция ветвления должна быть на стадии декодирования (а вычисление целевого адреса ветвления должно быть завершено), прежде чем процессор сможет предсказать, что она будет принята, верно?

Тогда как реализовать «сделанный прогноз» на такой машине, как 5-ступенчатый конвейер MIPS? (вычисление целевого адреса ветвления и выбор ветвления или нет решается на этапе ID (декодирования инструкций))

Если ветвь может быть разрешена на этапе ID, означает ли это, что прогнозирование выполняется на этапе IF (выборка инструкций)?

Я запутался, потому что кто-то сказал, что «предсказание выполнено» или «предсказание не выполнено» называется «статическим предсказанием ветвления», компилятор сделает все. Таким образом, в случае «прогнозируемого выполнения» компилятор вставит целевую инструкцию ветвления в позицию после инструкции ветвления.

Моя мысль верна? или его фраза верна?


person user3087000    schedule 11.09.2019    source источник


Ответы (1)


MIPS имеет слоты задержки ветвления, которые скрывают задержку ветвления для простого 5-ступенчатого конвейера, тривиально для безусловных ветвей (обнаруженных в ID, стадии после выборки), и даже для условных ветвей, оценивая их в первой половине EX, во времени до жду 2-го тайма IF. (MIPS I R2000 сделал это).

Но да, чтобы полностью избежать пузырей выборки, необходимо прогнозировать существование ветвей до их декодирования вместе с их целевыми адресами. (В том числе для безусловных прямых веток). Это делают настоящие предсказатели. См. Медленную jmp-инструкцию для примера на современной x86.

Но это очень далеко от классического пятиступенчатого RISC.

Если бы вы помещали такой динамический предсказатель в 5-ступенчатый RISC без слотов задержки ветвления, например простой RISC-V, вы, возможно, захотите заранее проверить, где происходит выборка в настоящий момент, чтобы у вас было предсказание того, что нужно извлекать в следующем цикле.


Для условных ветвей можно использовать только статическое предсказание с постоянным выполнением. (И обычно только с обратным смещением, потому что это часто являются ветвлениями цикла; предсказание того, что прямые ветки не будут - take хорошо работает на практике, особенно когда компиляторы / программисты выкладывают свой код соответствующим образом, поэтому общий случай для ветвей типа if() не принимается). К тому времени, когда вы сможете обнаружить, что ветвь вообще существует, вы уже знаете, является ли она безусловной, и в этом случае вам не нужно никаких прогнозов.

Если вы еще не используете такие приемы, как ранняя оценка условий ветвления с помощью MIPS I, ваша задержка ветвления будет составлять 2 цикла (от IF до EX) для условных переходов. Статическое всегда выполняемое предсказание сократит это до 1 цикла (IF to ID). Не 0, как вы говорите, потому что невыполненный путь все еще выбирается, пока декодируется сама инструкция перехода.

то есть вы можете спроектировать стадию ID для повторной выборки для следующего цикла, когда он видит условную ветвь. (Возможно, после проверки смещения вперед / назад, то есть только старшего бита значения дополнения до 2.)

Таким образом, вы оптимизируете провал прямых веток и зацикливание обратных ветвей, потому что они относительно распространены. Чтобы сделать еще лучше, вы должны использовать кеш динамических прогнозов, которые вы индексируете по адресу или различными сложными способами (например, TAGE использует недавнюю историю ветвлений как часть индекса и см. https://danluu.com/branch-prediction/ для исторического прогресса от очень простых предикторов к менее простым).

person Peter Cordes    schedule 17.09.2019