Они этого не делают, но в 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 для записи регистра назначения.