div
не просто, это одна из самых сложных целочисленных операций для вычисления!Он микрокодируется на процессорах Intel, в отличие от mov
, или add
/ sub
или даже imul
, которые на современном Intel являются однопроцессорными.См. https://agner.org/optimize/ для таблиц инструкций и руководств по микроархам.(Интересный факт: AMD Ryzen не микрокодирует div
; это всего 2 мопа, потому что он должен записать 2 выходных регистра. Piledriver и более поздние версии также делают 32 и 64-битное деление 2 моп.)
Все инструкциидекодировать до 1 или более мопов (большинство команд в большинстве программ составляют 1 моп на текущих процессорах).Инструкции, которые декодируют до 4 или менее мопов на процессорах Intel, описываются как «не микрокодированные», поскольку они не используют специальный механизм MSROM для многопользовательских инструкций.
Нет ЦП, которыеДля декодирования инструкций x86 в uops используется простой 3-фазный цикл выборки / декодирования / выполнения , так что часть предпосылки вашего вопроса не имеет смысла.Снова, посмотрите руководство по микроархам Agner Fog.
Вы уверены, что хотите спросить о современных процессорах Intel?Некоторые старые процессоры имеют внутреннее микрокодирование, особенно непоточные процессоры, в которых процесс выполнения различных команд может активировать различные внутренние логические блоки в другом порядке. Логика, управляющая этим, также называется микрокодом, но это микрокод другого типа, отличающийся от современного значения этого термина в контексте конвейерного процессора из строя.
Еслиэто то, что вы ищете, см. Как микрокод был реализован в ретро-процессорах? на retrocomputing.SE для нетрубопроводных процессоров, таких как 6502 и Z80, где некоторые из внутренних таймингов микрокодациклы задокументированы.
Как микрокодированные инструкции выполняются на современных процессорах Intel?
Когда микрокодированный «косвенный моп» достигает головы IDQ в семействе SandybridgeCPU , он принимает этап выдачи / переименования и передает его мопы с MS-ROM микрокод-секвенсора до тех пор, пока инструкция не выдаст все свои мопы, а затем интерфейс может возобновить выдачу других мопов во внешнийback-end заказа.
IDQ - это очередь декодирования инструкций, которая подает этап выдачи / переименования (который отправляет мопы из внешнего интерфейса во внешний илидер бэк-энд).Он буферизует мопы, которые поступают из кеша мопов + устаревшие декодеры, для поглощения пузырей и очередей.Это очередь на 56 моп в блок-схема Дэвида Кантера Haswell .(Но это показывает, что микрокод читается только перед очередью, что не соответствует описанию Intel некоторых событий perf 1 , или тому, что должно произойти для микрокодированных инструкций, выполняющих данные.зависимое количество мопов).
( Это может быть не на 100% точным , но, по крайней мере, работает как ментальная модель для большинства влияний на производительность 2 .могут быть другие объяснения эффектов производительности, которые мы наблюдали до сих пор.)
Это происходит только для инструкций, которые требуют более 4 моп;инструкции, которые требуют 4 или меньше декодирования для разделения мопов в обычных декодерах и могут выдавать нормально.например, xchg eax, ecx
- это 3 мопа на современном Intel: Почему XCHG reg, reg 3 микрооперационная инструкция на современных архитектурах Intel? подробно описывает, что мы можем выяснить о том, что на самом деле представляют собой эти мопы.
Специальный "косвенный" моп для микрокодированной инструкции занимает целую строку в кеше декодированного мопа, DSB (, потенциально вызывающий проблему производительности выравнивания кода ).Я не уверен, что они принимают только 1 запись в очереди, которая передает стадию проблемы из кэша UOP и / или устаревших декодеров, IDQ.Во всяком случае, я придумал термин «косвенный моп», чтобы описать его.Это действительно больше похоже на еще не декодированную инструкцию или указатель на MS-ROM.(Возможно, некоторые микрокодированные инструкции могут быть парой «обычных» мопов и одним указателем микрокода; это может объяснить, что для этого требуется целая строка кеша мопов.)
Я почти уверен, что они не будут полностью расширяться, пока не достигнут начала очереди, потому что некоторые микрокодированные инструкции имеют переменное число мопов в зависимости от данных в регистрах.В частности, rep movs
, который в основном реализует memcpy
.На самом деле это сложно;с различными стратегиями в зависимости от выравнивания и размера, rep movs
на самом деле нужно сделать некоторое условное ветвление.Но он перемещается в разные места MS-ROM, а не в разные места машинного кода x86 (значения RIP).См. Инструкции условного перехода в процедурах MSROM? .
Быстрый патент Intel также проливает некоторый свет на исходную реализацию в P6: первые n
итерации копированияоснованный на заднем плане;и укажите время для отправки значения ECX в MS.Исходя из этого, секвенсор микрокода может отправлять точно правильное количество копий мопов, если требуется больше, без необходимости разветвления в серверной части.Возможно, механизм обработки почти перекрывающихся src и dst или другие особые случаи не основаны на ветвлении, но Энди Глеу упомянул отсутствие предсказания ветвления микрокода как проблему для реализации.Итак, мы знаем, что они особенные.И это было в 6 дней;rep movsb
теперь более сложный.
В зависимости от инструкции, он может или не может истощить резервную станцию резервирования серверной части, известную как планировщик, при сортировке, что делать. rep movs
делает это для копий> 96 байт на Skylake, к сожалению (согласно моим тестам со счетчиками перфокарт, rep movs
между независимыми цепочками imul
).Это может быть связано с неверно предсказанными ветвями микрокода, которые не похожи на обычные ветви.Может быть, быстрое восстановление не работает, так что они не обнаруживаются и не обрабатываются до выхода на пенсию?(Подробнее об этом см. В разделе «Вопросы и ответы по микрокодам»).
rep movs
очень отличается от mov
.Обычный mov
, как и mov eax, [rdi + rcx*4]
, - одиночный моп, даже со сложным режимом адресации.Хранилище mov
представляет собой 1 микроплавленую меру, включающую как меру хранения, так и меру хранения данных, которые могут выполняться в любом порядке, записывая данные и физический адрес в буфер хранилища, чтобы хранилище могло выполнить фиксацию на L1d после выполнения инструкцииуходит из нерабочего состояния и становится не спекулятивным.Микрокод для rep movs
будет включать в себя множество загрузок и сохранений мопов.
Сноска 1 :
Мы знаем, что на Skylake есть такие мероприятия, как idq.ms_dsb_cycles
:
[Циклы, когда мопы, инициированные декодированным потоковым буфером (DSB), доставляются в очередь декодирования инструкций (IDQ), когда секвенсор микрокода [sic] (MS) занят]
Это не имеет смысла, если микрокод является лишь третьим возможным источником мопов для подачи в переднюю часть IDQ.Но затем есть событие, описание которого звучит так:
idq.ms_switches
[Количество переключений с DSB (декодер потока буфера) или MITE (устаревший конвейер декодирования) на секвенсор микрокода]
Я думаю, что это на самом деле означает, что он подсчитывает, когда этап выпуска / переименования переключается на получение мопов из секвенсора микрокода вместо IDQ (который содержит мопы из DSB и / или MITE),Не то чтобы IDQ переключал свой источник входящих мопов.
Сноска 2 :
Чтобы проверить эту теорию, мы могли бы построить тестовый случай смножество легко предсказуемых переходов к холодным строкам i-кеша после микрокодированной инструкции, и посмотреть, как далеко продвигается внешний интерфейс в случае пропадания кеша и постановки в очередь мопов в IDQ и другие внутренние буферы во время выполнения большого rep scasb
.
SCASB не поддерживает быстрые строки, поэтому он очень медленный и не затрагивает огромное количество памяти за цикл.Мы хотим, чтобы он ударил в L1d, поэтому сроки очень предсказуемы.Вероятно, пара 4 тыс. Страниц - это достаточно времени, чтобы клиентский интерфейс мог следить за большим количеством ошибок i-cache.Мы даже можем отобразить смежные виртуальные страницы на одну и ту же физическую страницу (например, из пространства пользователя с mmap
в файле)
Если пространство IDQ за микрокодированной инструкцией можно заполнить более поздними инструкциями во время ее выполнения, это оставляет больше места для внешнего интерфейса, чтобы извлечь из большего количества строк i-кеша, когда они понадобятся.Можно надеяться, что мы сможем обнаружить разницу с помощью общего количества циклов и / или других счетчиков производительности для выполнения rep scasb
плюс последовательность прыжков.Перед каждым тестом используйте clflushopt
в строках, содержащих инструкции перехода.
Чтобы протестировать rep movs
таким образом, мы могли бы, возможно, поиграть с виртуальной памятью, чтобы снова отобразить смежные страницы на одной физической страницедавая нам L1d хиты для load + store, но задержки dTLB было бы трудно контролировать.Или даже загрузиться с процессором в режиме без заполнения, но это очень сложно использовать, и потребуется собственное «ядро», чтобы результат был где-то видимым.
Я вполне уверен, что мы увидим мопы, входящие вIDQ, в то время как микрокодированная инструкция перешла во внешний интерфейс (если она еще не была заполнена).Событие перфекта
idq.ms_uops
[моп доставлено в очередь декодирования инструкций (IDQ), когда секвенсор микрокода (MS) занят]
и 2другие события, такие как то, что подсчитывают только мопы, поступающие из MITE (устаревшее декодирование) или мопы, поступающие из DSB (кеш мопов).Описание Intel этих событий совместимо с моим описанием того, как микрокодированная инструкция («косвенный моп») переходит на стадию проблемы для чтения мопов из секвенсора / ПЗУ микрокода, в то время как остальная часть внешнего интерфейса продолжает выполнять свою функцию доставки мопов вдругой конец IDQ, пока он не заполнится.