Как сосуществуют предиктор ветвления и целевой буфер ветвления?

Мой вопрос в том, как они сосуществуют и работают вместе в современной архитектуре ЦП?


person fyang29    schedule 02.12.2013    source источник
comment
Почему они должны мешать друг другу? Первый говорит вам, нужно ли переходить на условные ветки, второй говорит вам, куда переходить (на непрямые)   -  person Leeor    schedule 02.12.2013
comment
@Leeor Но я думаю, что BTB используется для каждой инструкции, полученной из I$. И индексируется ПК. После попадания нет необходимости в прогнозировании ветвления, и мы можем продолжить и получить инструкцию на ПК в BTB. И если это промах, предиктор ветвления вступает в игру и предсказывает исход ветвления. Учитывая, что BTB имеет показатель попаданий более 90%, тогда предиктор ветвлений используется редко... Где я ошибаюсь?   -  person fyang29    schedule 02.12.2013
comment
Вы хотите использовать значение в BTB только в том случае, если предсказатель ветвления говорит, что вы должны предсказать, что ветвь будет взята. Например, если ветвь прогнозируется только для определенных значений таблицы истории ветвлений (для двухуровневого адаптивного предиктора).   -  person Danny    schedule 03.12.2013
comment
@Дэнни Спасибо! Я думаю, что это имеет больше смысла сейчас.   -  person fyang29    schedule 03.12.2013


Ответы (1)


У вас немного наоборот. При каждой выборке вы индексируете свой предиктор ветвления, который сообщает вам, будет ли только что полученная вами инструкция будет декодирована в взятую ветвь. Если нет, вы получаете следующий последовательный адрес. Но если ваш предиктор ветвления говорит, что это будет занятая ветвь, вы не знаете, какую инструкцию выбрать следующей, так как вы еще не расшифровали эту инструкцию. Таким образом, чтобы не тратить циклы на ожидание разрешения ветки, вы должны использовать целевой буфер ветвления (или BTB). BTB хранит предыдущие адреса, по которым ветвь перенаправляла поток управления. Используя этот механизм, вы пытаетесь предсказать, куда на этот раз будет перенаправлен поток управления. Этот метод имеет 100% вероятность успеха для безусловных переходов, вызовов функций и возвратов в сочетании со стеком адресов возврата. На условных ветвях вероятность успеха немного ниже, но все еще очень хороша, учитывая высокую временную локальность целей ветвления. В качестве примера вы можете рассмотреть обратную ветвь цикла, которая всегда будет ветвиться в одно и то же место.

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

Вот наглядное объяснение того, как происходит поиск и обновление BTB:

http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html

person Tayyar R    schedule 29.07.2014
comment
+1 Конечно, реальные реализации могут быть сложнее. Например, BTB может быть непомеченным или использовать частичные теги, поэтому есть вероятность, что предсказание цели будет применено к другой ветви (так что даже безусловный прямой переход может привести к неправильному предсказанию цели). В качестве кеша целевых прогнозов даже с полными тегами существует вероятность промахов пропускной способности и конфликта (при условии, что он не полностью ассоциативен). Косвенные невозвратные прыжки с несколькими целями также могут привести к неверным предсказаниям. Даже RAS может дать сбой при переполнении, переключении контекста, неверном определении ветвления и т. д. - person Paul A. Clayton; 29.07.2014
comment
У меня есть несколько вопросов. 1) Как предиктор различается между прогнозированием условных ветвей и непрямых ветвей, потому что непрямые имеют больше возможных адресов возврата? 2) Разве BTB не смотрел сначала, чтобы увидеть, является ли инструкция даже ветвью (чтобы решить перейти к предсказателю)? 3) Какой тип неверного предсказания ветвления может быть обнаружен на этапе декодирования? (я знаю о реализации стадии выполнения) - person mezamorphic; 20.01.2015
comment
Хороший ответ! Думаю, может быть опечатка: На безусловных ветвях -> На условных ветвях. - person Carl Cook; 28.10.2017