Как предсказание ветвления взаимодействует с указателем инструкции

Насколько я понимаю, в начале конвейера процессора указатель инструкции (который указывает на адрес следующей инструкции для выполнения) обновляется предсказателем ветвления после выборки, так что этот новый адрес можно затем получить в следующем цикле. .

Однако, если указатель инструкции изменяется на ранней стадии конвейера, не повлияет ли это на инструкции, находящиеся в настоящее время на этапе выполнения, которые могут полагаться на старое значение указателя инструкций? Например, при выполнении call текущий EIP должен быть помещен в стек, но разве это не повлияет на обновление указателя инструкции во время прогнозирования ветвления?


person 1110101001    schedule 21.08.2018    source источник
comment
во многих конвейерных архитектурах счетчик программ является фиктивным, а тот, который программа видит, имеет правильное значение. есть несколько адресов указателей инструкций, используемых логикой, которая выполняет реальную тяжелую работу, одно или несколько вычислений предсказания ветвлений, фактический указатель, который идет на выборку из памяти, и т. д. Arm прост, счетчик программы находится на две инструкции впереди не было так давно, трубы еще глубже с предсказаниями. тем не менее, у нас все еще есть r15, который дает результат, как указано в наборе команд.   -  person old_timer    schedule 21.08.2018
comment
полезный (псевдо) регистр, такой как EIP, будет иметь правильное значение для используемого набора команд, независимо от каких-либо фиксированных или комбинационных адресов, используемых для фактической выборки.   -  person old_timer    schedule 21.08.2018


Ответы (1)


Кажется, вы предполагаете, что есть только один физический регистр EIP, который используется всем ядром процессора.

Это не работает, потому что каждая инструкция, которая может вызвать исключение, должна знать свой собственный адрес. Или, когда поступает внешнее прерывание, ЦП может решить обработать прерывание после любой инструкции, сделав это архитектурным EIP. В длинном режиме (x86-64) есть также режимы относительной адресации RIP, поэтому call - не единственная инструкция, для которой в качестве данных требуется текущий счетчик программ.

Простой конвейерный ЦП может иметь EIP для каждого этапа конвейера.

Современные суперскалярные нестандартные x86 связывают EIP (или RIP) с каждой действующей инструкцией (или, возможно, с каждым uop; но многопользовательские инструкции имеют все свои uop, связанные друг с другом, поэтому инструкция не может частично уйти в отставку.)

В отличие от других частей архитектурного состояния (например, EFLAGS, EAX и т. Д.) Значение статически известно после декодирования. Фактически даже раньше, чем непосредственные ценности; Границы команд обнаруживаются на этапе предварительного декодирования (или отмечаются в кэше L1i), так что несколько инструкций могут быть поданы на несколько декодеров параллельно.

Ранняя стадия выборки / декодирования может просто отслеживать адреса 16-байтовых или 32-байтовых блоков выборки, но после декодирования я предполагаю, что во внутреннем представлении uop есть поле адреса. Это может быть просто небольшое смещение по сравнению с предыдущими (для экономии места) для инструкций без ветвления, поэтому, если это когда-либо понадобится, его можно вычислить, но мы подробно рассмотрим детали реализации здесь. Выполнение вне очереди поддерживает иллюзию выполнения инструкций в программном порядке, и они действительно выдают и удаляют по порядку (ввод / выход из части ядра, выполняемой вне очереди).

Связано: Регистры x86: регистры MBR / MDR и инструкций аналогичны неправильное предположение, основанное на просмотре игрушечных процессоров. Также нет регистра «текущей инструкции», содержащего байты машинного кода. См. Дополнительные ссылки в моем ответе, чтобы узнать больше о процессорах OoO / pipelines.


Предсказание ветвления должно сработать до того, как блок будет даже декодирован. т.е. учитывая, что мы только что получили блок по адресу abc, нам нужно предсказать, какой блок выбрать следующим. то есть предсказание должно предсказывать наличие переходов в 16-байтовом блоке инструкций, которые будут декодироваться параллельно.

По теме: Почему Intel изменила статический механизм прогнозирования ветвлений за эти годы?

person Peter Cordes    schedule 21.08.2018
comment
Не вводит ли в заблуждение современного суперскалярного компьютера x86 с нарушением порядка следования EIP (или RIP), связанного с каждой инструкцией? Я считаю, что EIP похож на любой другой входной регистр, когда выполняется uop, то есть используется микроархитектурное значение EIP. - person Margaret Bloom; 21.08.2018
comment
@MargaretBloom: Не совсем; он не будет храниться в регистровом файле, потому что он статически известен для каждой инструкции во время декодирования и не может быть выводом. Зависимости элементов управления обрабатываются иначе, чем зависимости данных. Однако я перефразировал это предложение, поскольку оно звучало не совсем так, как я хотел сказать. - person Peter Cordes; 21.08.2018
comment
Ну конечно; естественно! UArch EIP не годится, я забыл о выполнении OoO. У каждого uOP должна быть своя инструкция EIP. Хотя это много места, вероятно, это смещение, как вы сказали (может быть, даже от архитектурного EIP, я не знаю). - person Margaret Bloom; 21.08.2018
comment
Большинству инструкций никогда действительно не нужно знать свой собственный IP-адрес, по крайней мере, эффективным способом, поэтому вполне возможно, что адрес не сохраняется с каждой инструкцией, а только вычисляется задним числом не обязательно быстрым способом, если происходит прерывание или исключение или что-то еще. Инструкции, которые используют IP напрямую, хотя такие как call или относящиеся к рипам, все равно будут заполнять его почти во время декодирования. Как вы заметили, это далеко от деталей реализации, и я просто предполагаю. - person BeeOnRope; 22.08.2018
comment
Кстати, я думаю, что блок выборки / декодирования в значительной степени должен вычислять точные адреса для прогнозов, а не использовать более крупную детализацию, например 32-байтовые, потому что (а) прямо после декодирования вам уже нужно знать правильное смещение в фрагменте, чтобы вы может правильно декодировать инструкции, а также потому, что вам нужно сформировать правильный непрерывный поток инструкций и (б) самому предиктору нужен фактический адрес, чтобы сделать его следующее предсказание, поскольку в блоке может быть несколько ветвей. Так (а) означает, что окно грубого прогноза мало, а (б) означает, что оно может быть нулевым. - person BeeOnRope; 22.08.2018
comment
Возможно, что предикторы на самом деле не ведут себя так, как я предлагаю в (b), то есть их самый жесткий цикл просто предсказывает на уровне фрагментов, а позже они уточняют цель для подачи на декодеры. Это означает, что они будут введены в заблуждение несколькими ветвями в одном и том же фрагменте с разными целями и шаблонами, и это можно будет протестировать с помощью программного обеспечения. - person BeeOnRope; 22.08.2018
comment
Да, я ненавижу мусор MBR / MDR из учебников уровня A. В любом случае, очевидно, что есть указатель инструкции, который управляет выборкой блока IFETCH и который увеличивается после консультации предсказания ветвления за одно атомарное действие; либо он увеличивается до следующей 16-байтовой границы, либо BPU устанавливает его на адрес назначения ветвления, который может находиться в середине 16-байтовой границы, и я думаю, что L1i игнорирует младшие 4 бита, поскольку он всегда выбирает 16-байтовую гранулярность, но младшие 4 бита позже указываются предкодеру, чтобы избавиться от этих инструкций для нового блока IFETCH. - person Lewis Kelsey; 03.04.2019
comment
.. и если в декодерах нет задержки (т.е. нет 2 групп декодирования (2 сложные инструкции), которые будут производить задержку в 1 цикл), то это должно быть указано декодерам, поскольку блок IFETCH будет запущен в 16 граница байта - person Lewis Kelsey; 03.04.2019