Что такое микрокодированная инструкция?
Я видел много литературы, ссылающейся на микрокодированные инструкции.
Что это такое и почему они используются?
1 ответ
CPU считывает машинный код и декодирует его во внутренние управляющие сигналы, которые отправляют правильные данные в правильные исполнительные устройства.
Большинство инструкций соответствуют одной внутренней операции и могут быть декодированы напрямую. (например, на x86, add eax, edx
просто отправляет eax и edx целочисленному ALU для операции ADD и помещает результат в eax.)
Некоторые другие отдельные инструкции делают гораздо больше работы. например, х86 rep movs
инвентарьmemcpy(edi, esi, ecx)
и требует ЦП для цикла.
Когда декодеры команд видят такую инструкцию, вместо того, чтобы просто генерировать внутренние управляющие сигналы, они считывают микрокод из ПЗУ микрокода.
Микрокодированная инструкция - это та, которая декодирует многие внутренние операции.
Современные процессоры x86 всегда декодируют инструкции x86 для внутренних микроопераций. В этой терминологии он по-прежнему не считается "микрокодированным", даже еслиadd [mem], eax
декодирует нагрузку от[mem]
, операция ALU ADD и сохранение обратно в [mem]
, Другой пример xchg eax, edx
, который декодирует до 3 моп на Intel Haswell. И что интересно, не совсем те же мопы, которые вы получили бы, если бы использовали 3 инструкции MOV для обмена с пустым регистром, потому что они не имеют нулевой задержки.
В процессорах Intel / AMD "микрокодирование" означает, что декодеры включают секвенсор микрокодов для подачи мопов из ПЗУ в конвейер, вместо того, чтобы создавать несколько мопов напрямую.
В современных процессорах Intel ограничение на то, что декодеры могут производить напрямую, без обращения к ПЗУ микрокода, составляет 4 моп (домен слияния). У AMD также есть одинарные или двойные инструкции FastPath, и помимо этого это VectorPath или Microcode, как объясняется в подробном обзоре Дэвида Кантера о AMD Bulldozer, в частности о его декодерах.
Другой пример - целочисленная DIV-команда x86, которая микрокодируется даже на современных процессорах, таких как Intel Haswell. См. Мой ответ на вопрос: почему этот код C++ быстрее, чем моя рукописная сборка для проверки гипотезы Коллатца? для чисел.
Разделение FP также медленное, но декодируется до одного мопа, поэтому оно не является узким местом переднего конца. Если деление FP встречается редко и не является частью узкого места задержки, оно может быть таким же дешевым, как умножение. (Но если выполнение должно ждать своего результата или узких мест в пропускной способности, это намного медленнее.)
Целочисленное деление и другие микрокодированные инструкции могут нагружать процессор и создавать эффекты, которые делают выравнивание кода более важным, чем это было бы иначе.
Чтобы узнать больше о внутренних процессорах x86, см. Вики по тегу x86 и особенно руководство по микроархам Agner Fog.
В некоторых старых / более простых процессорах каждая инструкция была эффективно закодирована. Например, 6502 выполнили 6502 инструкции , выполнив последовательность внутренних инструкций из ПЗУ декодирования PLA. Это хорошо работает для нетранслируемого ЦП, где порядок использования различных частей ЦП может варьироваться от инструкции к инструкции.
Исторически существовало иное техническое значение для "микрокода", означающее что-то вроде сигналов внутреннего контроля, декодированных из командного слова. Особенно в процессорах типа MIPS, где командное слово отображается непосредственно на эти управляющие сигналы без сложного декодирования. (У меня может быть это частично неправильно; я прочитал что-то подобное (кроме удаленного ответа на этот вопрос), но не смог найти его позже.)