Как слоты *удаления движения* работают в ЦП Intel?

Андреас Абель и Ян Райнеке обсуждают устранение ходов в своей статье, описывающей uiCA:

4.1.4 Устранение ходов. [...] Однако устранение этого хода не всегда бывает успешным. [...] Мы разработали микробенчмарки, которые используют эти счетчики для анализировать, когда устранение хода успешно. [...]
Следующая модель согласуется с нашими наблюдениями. Процессор отслеживает физические регистры, которые используются более чем одним архитектурный регистр. Мы говорим, что каждый такой физический регистр занимает один слот исключения. Ячейка на выбывание снова освобождается после соответствующие регистры были перезаписаны.* Количество инструкции перемещения, которые могут быть устранены в цикле, зависят от обоих от количества доступных слотов для устранения и от количества успешных исключений в предыдущем цикле.

Где я сделал акцент на той части, которую не понимаю.

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

Я только что отредактировал некоторые новые вещи в своем ответе после обсуждения с BeeOnRope о том, что FLAGS также являются ссылками на записи PRF. Ping, так как SO не уведомляет вас иначе.

Peter Cordes 24.01.2023 16:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Весь смысл mov-elimination заключается в том, что вместо выделения новой записи PRF (файл физического регистра) и запуска uop для чтения значения и записи его в эту новую запись (как это сделал бы lea rdx, [rcx+0]), mov rdx, rcx можно обрабатывать с помощью RAT. запись (таблица распределения регистров) для RDX указывает на тот же номер физического регистра, что и RCX в этой точке.

Таким образом, вся идея состоит в том, чтобы в какой-то момент обойти правило, согласно которому запись PRF является состоянием единого архитектурного регистра. Это, по-видимому, усложняет отслеживание того, когда запись PRF может быть освобождена, или для переименования более поздних мопов, когда два архитектурных регистра ссылаются на один и тот же физический регистр, или какие-то другие сложности.

«Слоты для исключения ходов» — это отдельный ресурс, а не записи PRF. Они существуют для решения любой дополнительной проблемы с отслеживанием, с которой столкнулась Intel. Слот для исключения ходов освобождается, когда вы перезаписываете пункт назначения mov позже, например. mov ecx, edx / not ecx немедленно освобождает все необходимые ресурсы для устранения движения.

Без исключения перемещения вы правы в том, как это работает; одна запись PRF содержит значение, записанное только в один архитектурный регистр, и является входной зависимостью для любых мопов, которые читают этот регистр до того, как он будет перезаписан.

За исключением того, что запись PRF также имеет место для кодов условий FLAGS, поэтому после такой инструкции, как add eax, ecx, которая записывает как FLAGS, так и целочисленную регистрацию, и RFLAGS, и RCX указывают на одну и ту же физическую регистрацию. Более поздние инструкции, такие как mov-immediate, not или lea, могут перезаписать регистр gp и оставить только CF и группу ФЛАГОВ SPAZO, указывающую на старый физический регистр. Такие инструкции, как cmp, stc или add [mem], eax записывают (часть) ФЛАГИ, но не целочисленный регистр.

Но это всего лишь две вещи (отдельно переименованные части FLAGS, CF и SF/PF/AF/ZF/OF, также известные как SPAZO), которые, возможно, все еще могут относиться к физическому регистру, отличному от целочисленного регистра GP. Возможно, с 1 битом на физический регистр, чтобы отслеживать, ссылается ли на него целочисленный регистр GP, вывод на пенсию может правильно их освободить при удалении uop, который записывает целочисленный регистр GP, с, возможно, просто проверкой состояния удаления записей RAT. для ФЛАГОВ. Или, может быть, каждая запись PRF имеет 3 бита, по одному для GP-integer, CF и SPAZO, как способ выведения из эксплуатации, чтобы выяснить, когда он может освободить физический регистр (когда он удаляет uop, который перезаписывает последнюю архитектурную ссылку на это.)

BeeOnRope предполагает, что вместо полного подсчета ссылок в каждой записи PRF (со счетчиками, которые могут считать до 15 в случае mov ecx, eax / mov edx, eax / ...), слоты исключения перемещений фактически являются подсчетами ссылок.

От xor-zeroing всегда можно отказаться, потому что физический нулевой регистр никогда не нужно освобождать, поэтому на него не нужно подсчитывать ссылки. (Существование физического нулевого регистра для целого числа и вектора вытекает из того факта, что SnB-семейство способно исключить идиомы обнуления как отсутствие uops.)


Связанный: Может ли MOV x86 быть «бесплатным»? Почему я вообще не могу воспроизвести это?, в котором упоминаются некоторые из того, что говорится в руководстве по оптимизации Intel о предпочтительности перезаписывать результат копирования регистра в ближайшее время, чтобы повысить вероятность успеха устранения перемещения. Но Intel, по крайней мере, в то время не упомянула подробности о том, какое ограничение ресурсов процессора было задействовано.

У Skylake больше слотов для удаления mov, чем у Ivy Bridge, поскольку мое тестирование показывает, что он не сталкивается с узким местом в тестовом примере, который они использовали, чтобы проиллюстрировать преимущество быстрой перезаписи mov.

Очень жаль, что Intel облажалась с Ice Lake/Tiger Lake и была вынуждена отключить его mov-elimination (для GP-integer) с обновлением микрокода, поскольку перезапись mov сразу означает, что это часть задержки критического пути, а не что вы хотите, если ваш код может работать на процессоре без исключения перемещения. Он снова работает в Alder Lake и Rocket Lake.

Во многих случаях вы вскоре перезапишете и копию, и оригинал, поэтому можно оставить место назначения без изменений в нескольких инструкциях. В идеале не оставляйте копию без изменений в течение длительного времени, если только это не приведет к увеличению количества циклов операций или ухудшению задержек критического пути на Ice Lake. (например, если вы сохраняете копию и только когда-либо читаете ее.) Следующее прерывание обычно приводит к сохранению/восстановлению всех регистров в любом случае, так что это не проблема, которая может «нарастать» даже для кода, который имеет несколько длинных- работающие циклы со многими удаленными копиями.

Да, слоты исключения перемещения представляют собой ресурсы в таблице, необходимые для отслеживания того, какие арочные регистры сопоставляются с одним и тем же физическим регистром после того, как произошло исключение перемещения. Как минимум, с ним нужно проконсультироваться при выходе на пенсию, чтобы узнать, безопасно ли освобождать preg или на него все еще ссылаются. Есть также некоторая сложность с флагами: так как они связаны с прегами, но устранение перемещения применяется только к части без флага, эта таблица должна помнить, какой из архегов владеет соответствующим флагом или чем-то подобным.

BeeOnRope 23.01.2023 03:18

@BeeOnRope: я думаю, отслеживание в отдельной таблице было дешевле, чем подсчет ссылок для каждой преги? Или какой-либо другой способ выяснить, что «архитектурное состояние в текущем состоянии выхода на пенсию не соответствует этому preg». Поскольку любые более старые мопы уже прочитали значение, более молодые мопы (или откат) могут прочитать его только в том случае, если на него ссылается целочисленная регистрационная группа GP или EFLAGS. Mov-elim не работает или не используется мультиоператорными insns (например, xchg), поэтому дополнительные «архитектурные» регистры для использования микрокода не должны участвовать в этой проверке.

Peter Cordes 23.01.2023 05:38

@BeeOnRope: Учитывая значение FLAGS и целочисленного значения, даже без mov-elim, это не так просто, как освобождение от пенсии старой preg при удалении uop, который записал регистр. Хотя в качестве единственного другого возможного эталона используются только ФЛАГИ, это, по-видимому, достаточно дешево, чтобы просто проверить с помощью небольшого целочисленного компаратора даже для 8 / такт (4 / логическое ядро) на пенсию или 12 / 6 на Alder Lake. Но проверка всех 16 целочисленных регистров + ФЛАГИ будут складываться.

Peter Cordes 23.01.2023 05:42

Насколько я понимаю, эта другая таблица фактически является счетчиком ссылок, но они хотят обрабатывать случай refs == 1 (где не произошло устранение перемещения) отдельно от всех других случаев, чтобы они могли избежать выделения ресурсов для выполнения подсчет ссылок в первую очередь, поскольку они ограничены. Таким образом, второй регистр, который получает псевдоним одного preg, запускает выделение в этой таблице. По крайней мере, это то, что я понял из прочитанного.

BeeOnRope 23.01.2023 15:06

_ Учитывая разницу между FLAGS и целочисленным значением, даже без mov-elim, это не так просто, как освобождение от пенсии старой preg при удалении uop, который записал регистр. _ Да, именно, выход на пенсию должен знать об этом даже без исключения ходов, но это добавляет сложности и к исключению ходов: например, простой подсчет ссылок может не работать, потому что вам нужно ответить на вопрос, есть ли какие-либо из оставшихся ссылок на этот pregs — это те, которые пришли вместе с флагами. Поскольку mov не копирует флаги, я думаю, что только первоначальный владелец preg мог иметь связанные флаги.

BeeOnRope 23.01.2023 15:10

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