EDIT: Моя путаница возникает, потому что, конечно, предсказывая, какая ветка взята, вы также эффективно выполняете целевое предсказание.
Этот вопрос неотъемлемо связан с моим первым вопросом по теме:
предсказание ветвления и предсказание целевой ветки
Глядя на принятый ответ:
Безусловная ветвь, фиксированная цель
- Бесконечная петля
goto
break
илиcontinue
statement- Конец предложения "then" оператора
if/else
(чтобы перейти к предложениюelse
)- Невиртуальный вызов функции
Безусловная ветвь, переменная target
- Возврат из функции
- вызов виртуальной функции
- Вызов указателя функций
switch
(если скомпилирован в таблицу перехода)Условная ветвь, фиксированная цель
if
switch
(если скомпилирован в ряд операторовif/else
)- Проверка условий цикла
- Операторы
&&
и||
- Тернарный
?:
операторУсловная ветвь, переменная target
- Меньше вероятность появления в обычных условиях, но компилятор может синтезировать его как оптимизацию, объединяя два из вышеуказанных случаев. Например, на x86 компилятор может оптимизировать код типа
if (condition) { obj->VirtualFunctionCall(); }
в условный косвенный скачок, например,jne *%eax
, если он появляется в конце функции из-за оптимизации хвостового вызова.
Если у меня есть следующий код:
if(something){
//a
}
else{
//b
}
(BP = "Прогнозирование ветвей" и BTP = "Прогнозируемое предсказание ветвей" )
Его довольно очевидный BP используется для оценки условного something
. Однако я пытаюсь понять, участвует ли BTP в определении того, что происходит в ветке a
. Определяет ли BTP адрес кода, расположенного в ветке a
/b
, в зависимости от результата BP?
Я спрашиваю, пожалуйста, на этой странице wikipedia (http://en.wikipedia.org/wiki/Branch_target_predictor):
В компьютерной архитектуре предиктор целевой ветки является частью процессор, который предсказывает цель принятой условной ветки или безусловная инструкция ветвления перед мишенью ветки команда вычисляется исполнительным блоком процессора.
он предполагает, что BTP используется для прогнозирования цели после того, как условие было предсказано.
1) Может ли кто-нибудь прояснить сказанное выше?
Второй связанный вопрос: как BP и BTP отличаются тем, как они взаимодействуют с конвейером fetch/decode/execute/write-back процессора? Начинается ли ВР на этапе выборки или декодирования? После этапа выполнения условного кода мы можем проверить правильность предсказания и обновление кэша предсказания ветвлений.
2) Как работает BTP в отношении этапов CPU fetch/decode/execute/write-back?