Ответ 1
-
Как объясняет микроархор Agner Fog, механизм стека обрабатывает часть
rsp+=8
/rsp-=8
push/pop/call/ret на этапе выпуска конвейера (перед выпуском uops в часть Out-of-Order (OoO) ядра).Таким образом, часть выполнения OoO ядра должна обрабатывать часть загрузки/хранения с адресом, сгенерированным движком стека. Иногда приходится вставлять uop для синхронизации смещения от
rsp
при переполнении счетчика 8 бит, или когда ядро OoO требуется прямое значениеrsp
(например,sub rsp, 8
илиmov [rsp-8], eax
послеcall
,ret
,push
илиpop
обычно приводят к добавлению дополнительного урона в процессоры Intel. Процессоры AMD, по-видимому, не нуждаются в дополнительных синхронизациях).Обратите внимание, что таблицы инструкций Agner показывают, что Pentium-M и последующее декодирование
pop reg
на один uop, который выполняется только в порту загрузки. Но Pentium II/III декодируетpop eax
до 2 uops; 1 ALU и 1 нагрузка, потому что нет никакого механизма стека для обработки настройки ESP вне ядра вне порядка. Помимо получения дополнительных настроек, длинная цепочка push/pop и call/ret создает последовательную зависимость от ESP, поэтому выполнение вне очереди должно пережевывать через ALU до того, как значение доступно дляmov ebp, esp
, или адрес дляmov eax, [esp+16]
.
-
Семейство микроархитов P6 (PPro to Nehalem) хранило входные значения для uop непосредственно в ROB. При выпуске/переименовании "холодные" регистровые входы считываются из файла архитектурного регистра в ROB (что может быть узким местом из-за ограниченных портов чтения. См. Стойки для чтения в регистре). После выполнения uop результат записывается в ROB для чтения других uops. Файл архитектурного регистра обновляется со значениями из ROB при выходе из системы.
Микроархитектуры SnB-семейства (и P4) имеют файл физического регистра, поэтому ROB хранит номера регистров (т.е. уровень косвенности) вместо данных напрямую. Буфер повторного заказа по-прежнему является отличным именем для этой части процессора.
Обратите внимание, что SnB вводит AVX с векторами 256b. Сделать каждую запись ROB достаточно большой, чтобы хранить векторы двойного размера, по-видимому, нежелательно по сравнению с тем, чтобы хранить их только в меньшем файле регистра FP.
SnB упростил формат uop для экономии энергии. Это привело к жертве в микропроцессоре uop, однако: декодеры и uop-cache все еще могут сжимать память с помощью двух регистровых (индексированных) режимов адресации, но они "повторно" разминирован "перед выпуском в ядро ООО.