Стопочный буфер предсказания адреса возврата против сохраненного в стеке адреса возврата?

Читал "Микроархитектуру процессоров Intel, AMD и VIA" Агнера Фога, а на странице 34 он описывает "предсказание обратного адреса":

http://www.agner.org/optimize/microarchitecture.pdf

3.15 Возврат (все процессоры, кроме P1)

Лучший метод используется для возврата. Буфер Last-In-First-Out, называемый буфером стека возврата, запоминает адрес возврата каждый раз, когда выполняется инструкция вызова, и использует его для прогнозирования, куда пойдет соответствующий возврат. Этот механизм обеспечивает правильное предсказание инструкций возврата при вызове одной и той же подпрограммы из нескольких разных мест.

Мне немного непонятно, зачем это нужно, учитывая, что адреса возврата все равно хранятся в стеке?

Так, какова цель хранения адресов возврата в стеке, если есть и этот метод? Используется ли сохраненное в стеке значение, только если этот метод прогнозирования не работает?

2 ответа

Решение

Предикторы, как правило, являются частью этапа извлечения, чтобы определить, какие инструкции нужно извлечь в следующий раз. Это происходит до того, как процессор декодировал инструкции, и поэтому даже не знает с уверенностью, что существует команда ветвления. Как и все предикторы, цель предиктора адреса возврата состоит в том, чтобы быстрее получить направление / цель ветви. Инструкция возврата - это ветвь, и поэтому она обычно имеет запись предиктора ветвления, чтобы определить, берется ли она и где находится цель. С предиктором обратного адреса обращаются вместо обычного целевого буфера ветвления.

Таким образом, возможно, за 50 инструкций перед оператором return фактически "выполняется", стадия выборки предсказывает инструкцию возврата и адрес инструкции для выборки далее. Позже, когда выполняется возврат, адрес читается из стека и сравнивается с тем, куда, как предполагалось, возвращался возврат. Если они одинаковы, выполнение продолжается, иначе выполнение откатывается, чтобы использовать правильный адрес возврата.

Зачем хранить в стеке? Во-первых, процессор не знает, сработал ли предиктор, не сравнивая его с адресом, хранящимся в стеке. Во-вторых, стек является "официальным" адресом возврата, который может быть изменен по уважительным причинам. В-третьих, предиктор обратного адреса имеет ограниченное количество записей. Стек необходим для инструкций возврата, для которых не было места для хранения адресов в предикторе.

Помимо замечательного объяснения Brians, есть тот факт, что стек находится в памяти. Вам не нужно переходить к блоку памяти и выполнять поиск в памяти (не говоря уже о преобразовании адреса в физический) с какого-либо стекового адреса каждый раз, когда вы хотите предсказать результат ветвления. Предсказание отрасли хочет быть самодостаточным. Вы также можете просмотреть RSB как еще одну форму кэширования данных.

Другие вопросы по тегам