Как микрокоды выполняются во время цикла инструкций? - PullRequest
2 голосов
/ 20 мая 2019

Из открытых ресурсов я могу сделать вывод, что микрокод - это примерно то, что может быть выполнено непосредственно ЦПУ и отвечает за реализацию кодов команд.Также Wikipedia указывает, что каждое выполнение кода команды будет проходить через цикл команд fetch-decode-execute.Однако я не могу найти никаких ссылок, объясняющих, как выполняется микрокод во время этого трехфазного цикла.Итак, мой вопрос, какова взаимосвязь между выполнением микрокода и циклом выполнения команд?Как микрокоды работают на этапе выборки, декодирования и выполнения инструкции?

Также этот stackoverflow anwser говорит о том, что в современных процессорах Intel даже самые простые инструкции, такие как DIV и MOV будет скомпилировано в микрокоды перед выполнением, поэтому было бы лучше, если бы кто-нибудь мог объяснить это примерами из таких процессоров, если это действительно так.

1 Ответ

5 голосов
/ 20 мая 2019

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, пока он не заполнится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...