Почему инструкции по уничтожению зависимостей занимают слоты резервных станций? - PullRequest
1 голос
/ 14 апреля 2020

Я всегда думал, что инструкции по уничтожению зависимостей, например, xor reg, reg, не должны выполняться и готовы к удалению, как только Renamer перемещает их в буфер переупорядочения.

Я просто измеряю количество микроопераций, попадающих в РС с событием uops_issued.any, и было удивлено числом. Все xor reg, reg за убийственную зависимость были учтены в событии perf.

Почему бы просто не поместить убийственную зависимость в ROB, без бесполезного нарушения Станции резервирования?

1 Ответ

4 голосов
/ 14 апреля 2020

Они этого не делают, но в AFAIK нет счетчика внешнего интерфейса для неиспользованного домена. Если у вас нет ошибочных прогнозов ветвления, которые приводят к удалению мопов из RS после выпуска / до exe c, не имеет значения, в каком месте конвейера вы рассчитываете, поэтому существует обходной путь.

Для подсчета мопов RS используйте uops_executed.thread, который подсчитывает мопы, которые успешно (?) Выполнились. Я не проверял, учитываются ли повторы отправленных мертвецами мопов uops_executed при каждой попытке отправки или только uops_dispatched_port.port_[0..7].

См. Может ли MOV x86 действительно быть "свободным"? Почему я вообще не могу воспроизвести это? для примера использования perf для сортировки исключенного и неуничтоженного и входного слитого домена и внутреннего неиспользуемого домена.

Я просто измеряю количество микроопераций, попадающих в RS, с событием uops_issued.any

Это событие подсчитывает количество мопов слитых доменов, выданных в ROB . Он подсчитывает 1 для микроплавких мопов, таких как add eax, [rdi] или mov al, [rsi], которые сливаются в нижнюю половину RAX (даже если они считаются 2 uops_executed), и 1 для исключенных мопов, таких как mov reg,reg и xor same,same (0 uops_executed).

perf list действительно вводит его в заблуждение так (на Skylake), так что путаница понятна. RAT) выдает Reservation Station (RS)]


Я всегда думал, что инструкции по уничтожению зависимостей, например, xor reg, reg, не нужно выполнять и они готовы к выходу на пенсию как только Renamer перемещает их в буфер переупорядочения.

Да, я тоже так думаю, что они входят в ROB, помеченный как уже выполненный, и не касаются RS.

Это делает только семья Сэндибридж (включая Skylake / IceLake); другие микроархитектуры (такие как Zen AFAIK) действительно нуждаются в внутреннем мопе, чтобы фактически записать ноль. Каков наилучший способ установить регистр в ноль в сборке x86: xor, mov или и?

AMD выполняет удаление-перемещение mov для векторных ходов (начиная с Bulldozer) и GP-integer движется с Zen, поэтому они, вероятно, обрабатываются как Intel xor-zeroing или mov.

Одно из предположений о механизме на Sandybridge заключается в том, что xor-zeroing (регистры GP-integer или XMM / YMM) переименовывает в внутренний нулевой регистр. http://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ это проверено, и инструкции по обнулению не используют дополнительную запись PRF для записи регистра назначения.

...