задержка pu sh, указанная на uops.info, выше, чем я ожидал - PullRequest
0 голосов
/ 05 апреля 2020

Я слышал, что ЦИКЛ push составляет всего 1 , и в процессорах, предназначенных для push, есть какой-то особый процесс, который делает его особенным и вместо этого:

sub rsp, 24

mov [rsp], rbx
mov [rsp+8], rcx
mov [rsp+16], rdx

лучше использовать pu sh следующим образом:

push rbx
push rcx
push rdx

но сегодня я видел задержку для PU SH (R64) , равную [≤2; ≤11] с uops 2 !!! что за ... !!! так что push это не только 1 латентность !!!!!!!!! и это тяжелая инструкция! это удивительно только в AMD Zen2 CPU, который ≤0 с uops 1, и это плохо для процессоров Intel !!! Я прав?

1 Ответ

1 голос
/ 05 апреля 2020

Это хранилище, конечно, оно не имеет задержку одного цикла для данных. Это один моп для внешнего интерфейса, но, к сожалению, uops.info показывает число бэк-эндов , не слитый домен, в их таблице.

Числа для push очень аналогичны числам для mov (m64, r64), включая время ожидания и моп, например, для SKX латентность указана как [≤2;≤10].


ЦИКЛ pu sh составляет всего 1

Это даже не имеет смысла. Модель стоимости для суперскалярных неупорядоченных процессоров не является одномерной. Вы не можете просто получить 1 номер для каждой инструкции и сложить их, чтобы узнать общую стоимость. См. Ответ @ BeeOnRope на Сколько циклов ЦП необходимо для каждой инструкции по сборке?

Распространенными узкими местами (кроме пропусков памяти и ветвлений) являются внешняя пропускная способность, внутренние порты, и время ожидания.


и в процессорах, разработанных для pu sh, есть особый процесс, который делает его особенным

Эффективная задержка для изменения Указатель стека равен нулю, благодаря механизму стека.

Это настолько особенное, что https://uops.info/ даже не пытается измерить задержку RSP-> RSP так, как они измеряют другие инструкции. Stack-syn c uops может усложнить это.

Например, из подробностей теста Результаты задержки SKX , вы можете видеть, что они проверяли только задержку от ввода в регистр до перезагрузки памяти, но ничего для сам операнд RSP, за исключением части цепочки перезагрузки [rsp] обратно в цепочку зависимостей для RSP для следующего push.

  • операнд 1 (r): регистр (RAX , RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15)
  • Операнд 2 (r / w, подавлен ): Регистр (RSP)
  • операнд 3 (с подавлением): память

  • операнд задержки 1 → 3: ≤2

  • Операнд задержки 3 → 3 (адрес, базовый регистр): ≤11

Я уже объяснил, как посмотреть, что измеряется на вашем последнем вопросе, Что делать Несколько значений или диапазонов означают задержку для одной инструкции? .


А если вы посмотрите на счетчики uop для процессоров Intel, в данный момент https://uops.info/ показывает неиспользуемый домен количество операций в таблице в таблице; вам нужно перейти на страницу измерений (например, пропускная способность для SKX: https://www.uops.info/html-tp/SKX/PUSH_R64-Measurements.html), чтобы увидеть RETIRE_SLOTS: 1.04. В переднем конце это магазин с микроплавлением с одним мопом, такой же, как mov [rsp], rbx, который также является 2 внутренними мопами.

Но push измеряет всего над 1 при тестировании просто большой блок push r8 инструкций. .04 - это амортизированная стоимость синхроимпульсов стека c моп, когда переполнение смещения механизма стека. Что такое механизм стека в микроархитектуре Sandybridge? (это «особый механизм», на который вы ссылались.)

Прочтите руководство по микроархам Agner Fog, чтобы получить некоторые подробности, которые помогут вам сделать смысл таблиц.

Процессоры AMD не называют это «микро-слиянием», они просто всегда хранят адрес магазина и данные магазина вместе как 1 моп во внешнем интерфейсе. Вот почему в uops.info она указана как 1 моп для AMD, хотя в действительности она не отличается от того, как Intel обрабатывает push.

...