В центральных процессорах компьютеров микрооперации (также известные как микрооперации или μops , исторически также как микродействия [2] ) представляют собой подробные низкоуровневые инструкции, используемые в некоторых конструкциях для реализации сложных машинных инструкций (иногда называемых макроинструкциями в этом контексте). [3] : 8–9
Обычно микрооперации выполняют базовые операции с данными, хранящимися в одном или нескольких регистрах , включая передачу данных между регистрами или между регистрами и внешними шинами центрального процессора (ЦП), а также выполнение арифметических или логических операций с регистрами. В типичном цикле выборка-декодирование-выполнение каждый шаг макроинструкции разлагается во время ее выполнения, поэтому ЦП определяет и проходит через ряд микроопераций. Выполнение микроопераций выполняется под контролем блока управления ЦП , который принимает решение об их выполнении, выполняя различные оптимизации, такие как переупорядочение, слияние и кэширование. [1]
Различные формы μops долгое время были основой для традиционных микрокодовых процедур, используемых для упрощения реализации конкретной конструкции ЦП или, возможно, просто для последовательности определенных многошаговых операций или режимов адресации. Совсем недавно μops также использовались другим способом, чтобы позволить современным процессорам CISC более легко обрабатывать асинхронное параллельное и спекулятивное выполнение: как и в случае с традиционным микрокодом, выполняется один или несколько поисков в таблице (или эквивалент) для поиска соответствующей μop-последовательности на основе кодирования и семантики машинной инструкции (шаг декодирования или трансляции), однако вместо того, чтобы иметь жесткие μop-последовательности, управляющие ЦП напрямую из микрокода- ROM , μops здесь динамически буферизуются для перепланирования перед выполнением. [4] : 6–7, 9–11
Эта буферизация означает, что этапы выборки и декодирования могут быть более отделены от исполнительных блоков, чем это возможно в более традиционной микрокодированной (или жестко зашитой) конструкции. Поскольку это обеспечивает определенную степень свободы относительно порядка выполнения, это делает возможным некоторое извлечение параллелизма на уровне инструкций из обычной однопоточной программы (при условии проверки зависимостей и т. д.). Это открывает возможность для большего анализа и, следовательно, также для переупорядочивания последовательностей кода с целью динамической оптимизации отображения и планирования μops на машинные ресурсы (такие как ALU , блоки загрузки/хранения и т. д.). Поскольку это происходит на μop-уровне, подоперации различных машинных (макро) инструкций часто могут смешиваться в определенной μop-последовательности, образуя частично переупорядоченные машинные инструкции как прямое следствие неупорядоченной отправки микроинструкций из нескольких макроинструкций. Однако это не то же самое, что и слияние микроопераций , которое нацелено на то, что более сложная микроинструкция может заменить несколько более простых микроинструкций в определенных случаях, как правило, для того, чтобы минимизировать изменения состояния и использование очереди и буферного пространства переупорядочения , тем самым снижая потребление энергии. Слияние микроопераций используется в некоторых современных конструкциях ЦП. [3] : 89–91, 105–106 [4] : 6–7, 9–15
Оптимизация выполнения пошла еще дальше; процессоры не только переводят множество машинных инструкций в ряд μops, но и делают обратное, когда это уместно; они объединяют определенные последовательности машинных инструкций (например, сравнение, за которым следует условный переход) в более сложный μop, который лучше соответствует модели выполнения и, таким образом, может быть выполнен быстрее или с меньшими задействованными машинными ресурсами. Это также известно как слияние макро-операций . [3] : 106–107 [4] : 12–13
Другой способ попытаться улучшить производительность — кэшировать декодированные микрооперации в кэше микроопераций , так что если та же макроинструкция выполняется снова, процессор может напрямую получить доступ к декодированным микрооперациям из кэша, вместо того, чтобы декодировать их снова. Кэш трассировки выполнения , обнаруженный в микроархитектуре Intel NetBurst ( Pentium 4 ), является распространенным примером этой техники. [5] Размер этого кэша может быть указан в терминах того, сколько тысяч (или строго кратных 1024) микроопераций он может хранить: Kμops . [6]