Стопочный буфер предсказания адреса возврата против сохраненного в стеке адреса возврата?
Читал "Микроархитектуру процессоров Intel, AMD и VIA" Агнера Фога, а на странице 34 он описывает "предсказание обратного адреса":
http://www.agner.org/optimize/microarchitecture.pdf
3.15 Возврат (все процессоры, кроме P1)
Лучший метод используется для возврата. Буфер Last-In-First-Out, называемый буфером стека возврата, запоминает адрес возврата каждый раз, когда выполняется инструкция вызова, и использует его для прогнозирования, куда пойдет соответствующий возврат. Этот механизм обеспечивает правильное предсказание инструкций возврата при вызове одной и той же подпрограммы из нескольких разных мест.
Мне немного непонятно, зачем это нужно, учитывая, что адреса возврата все равно хранятся в стеке?
Так, какова цель хранения адресов возврата в стеке, если есть и этот метод? Используется ли сохраненное в стеке значение, только если этот метод прогнозирования не работает?
2 ответа
Предикторы, как правило, являются частью этапа извлечения, чтобы определить, какие инструкции нужно извлечь в следующий раз. Это происходит до того, как процессор декодировал инструкции, и поэтому даже не знает с уверенностью, что существует команда ветвления. Как и все предикторы, цель предиктора адреса возврата состоит в том, чтобы быстрее получить направление / цель ветви. Инструкция возврата - это ветвь, и поэтому она обычно имеет запись предиктора ветвления, чтобы определить, берется ли она и где находится цель. С предиктором обратного адреса обращаются вместо обычного целевого буфера ветвления.
Таким образом, возможно, за 50 инструкций перед оператором return фактически "выполняется", стадия выборки предсказывает инструкцию возврата и адрес инструкции для выборки далее. Позже, когда выполняется возврат, адрес читается из стека и сравнивается с тем, куда, как предполагалось, возвращался возврат. Если они одинаковы, выполнение продолжается, иначе выполнение откатывается, чтобы использовать правильный адрес возврата.
Зачем хранить в стеке? Во-первых, процессор не знает, сработал ли предиктор, не сравнивая его с адресом, хранящимся в стеке. Во-вторых, стек является "официальным" адресом возврата, который может быть изменен по уважительным причинам. В-третьих, предиктор обратного адреса имеет ограниченное количество записей. Стек необходим для инструкций возврата, для которых не было места для хранения адресов в предикторе.
Помимо замечательного объяснения Brians, есть тот факт, что стек находится в памяти. Вам не нужно переходить к блоку памяти и выполнять поиск в памяти (не говоря уже о преобразовании адреса в физический) с какого-либо стекового адреса каждый раз, когда вы хотите предсказать результат ветвления. Предсказание отрасли хочет быть самодостаточным. Вы также можете просмотреть RSB как еще одну форму кэширования данных.