Мой вопрос в том, как они сосуществуют и работают вместе в современной архитектуре ЦП?
Как сосуществуют предиктор ветвления и целевой буфер ветвления?
Ответы (1)
У вас немного наоборот. При каждой выборке вы индексируете свой предиктор ветвления, который сообщает вам, будет ли только что полученная вами инструкция будет декодирована в взятую ветвь. Если нет, вы получаете следующий последовательный адрес. Но если ваш предиктор ветвления говорит, что это будет занятая ветвь, вы не знаете, какую инструкцию выбрать следующей, так как вы еще не расшифровали эту инструкцию. Таким образом, чтобы не тратить циклы на ожидание разрешения ветки, вы должны использовать целевой буфер ветвления (или BTB). BTB хранит предыдущие адреса, по которым ветвь перенаправляла поток управления. Используя этот механизм, вы пытаетесь предсказать, куда на этот раз будет перенаправлен поток управления. Этот метод имеет 100% вероятность успеха для безусловных переходов, вызовов функций и возвратов в сочетании со стеком адресов возврата. На условных ветвях вероятность успеха немного ниже, но все еще очень хороша, учитывая высокую временную локальность целей ветвления. В качестве примера вы можете рассмотреть обратную ветвь цикла, которая всегда будет ветвиться в одно и то же место.
Когда инструкция ветвления фактически разрешается (обычно на этапе декодирования или выполнения конвейера, в зависимости от реализации), вы корректируете значения как в предсказателе ветвления, так и в BTB, чтобы иметь более актуальную информацию для будущих прогнозов.
Вот наглядное объяснение того, как происходит поиск и обновление BTB:
http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html