Микроархитектура процессоров
Прежде чем приступить к рассмотрению архитектур реальных процессоров, необходимо напомнить принципы работы процессоров на основе конструктивной схемы простейшего гипотетического, или «классического», процессора. В основе архитектуры любого процессора лежит несколько конструктивных элементов: кэш команд и данных, предпроцессор (Front End) и постпроцессор, называемый также блоком исполнения команд (Execution Engine).

Процесс обработки данных состоит из нескольких характерных этапов. Прежде всего инструкции и данные забираются из кэша L1 (который разделен на кэш инструкций и кэш данных). Эта процедура называется выборкой. После этого выбранные из кэша инструкции декодируются в понятные для данного процессора примитивы (машинные команды). Данная процедура называется декодированием. Далее декодированные команды поступают на исполнительные блоки процессора, выполняются, а результат записывается в оперативную память.
Процессы выборки инструкций из кэша, их декодирование и продвижение к исполнительным блокам осуществляются в предпроцессоре, а процесс выполнения декодированных команд — в постпроцессоре. Таким образом, даже в самом простейшем случае команда проходит как минимум четыре стадии обработки:
1. выборку из кэша;
2. декодирование;
3. выполнение;
4. запись результатов.
Данные стадии принято называть конвейером обработки команд. В нашем случае конвейер является четырехступенчатым. Важно, что каждую из этих ступеней команда должна проходить ровно за один такт. Соответственно для четырехступенчатого конвейера на выполнение одной команды отводится ровно четыре такта.

Конструктивная схема конвейерной обработки «классического» процессора
Конечно, рассмотренный нами процессор является в определенной мере гипотетическим. В реальных процессорах конвейер обработки команд может быть более сложным и включать большее количество ступеней. Однако сама идеология построения процессора остается неизменной. Причина увеличения длины конвейера заключается в том, что многие команды являются довольно сложными и не могут быть выполнены за один такт процессора, особенно при высоких тактовых частотах. Поэтому каждая из четырех стадий обработки команд (выборка, декодирование, выполнение, запись) может состоять из нескольких ступеней конвейера. Собственно, длина конвейера является одной из наиболее значимых характеристик любого процессора.
В случае «классического» гипотетического процессора исполнение кода процессором начинается с процесса выборки инструкций и данных из кэша L1. Однако для того, чтобы инструкции и данные попали в этот кэш, их нужно предварительно туда загрузить из оперативной памяти. Такой процесс называется предвыборкой данных и инструкций из оперативной памяти.
В соответствии со схемой «классического» процессора процедура исполнения кода процессором начинается с выборки инструкций в формате х86 и данных из кэша L1. Инструкции х86 имеют переменную длину, причем информация о длине инструкций сохраняется в специальных полях в кэше инструкций L1. Загрузка инструкций переменной длины х86 из кэша L1 происходит блоками определенной длины, из которых в дальнейшем выделяются инструкции, которые подвергаются декодированию.
Когда в потоке инструкций встречаются ветвления или переходы, выборка очередного блока инструкций производится с использованием механизма предсказания переходов.
Всякий процессор в конечном счете должен быть сконструирован таким образом, чтобы за минимальное время выполнять максимальное количество инструкций. Именно количество выполняемых за единицу времени инструкций и определяет производительность процессора.
Существуют два принципиально различных подхода к повышению производительности процессора (не считая, конечно, увеличения тактовой частоты). Суть первого заключается в том, чтобы за счет уменьшения длины конвейера увеличивать количество исполнительных блоков. Таким образом, по существу, реализуется множество параллельных коротких конвейеров. При этом постпроцессор работает по классической схеме: осуществляет выборку команд, их декодирование и отправку на множество исполнительных блоков. Такой подход позволяет в полной мере реализовать параллелизм на уровне инструкций (Instruction-Level Parallelism, ILP), когда несколько инструкций выполняются одновременно в различных исполнительных блоках процессора. Важно, что количество ступеней конвейера внутри постпроцессора (исполнительного блока) здесь невелико, поэтому инструкции выполняются за небольшое количество циклов.

Микроархитектура процессоров
Для реализации параллелизма на уровне инструкций необходимо, чтобы поступающие на исполнительные блоки команды можно было выполнять параллельно. Однако если, к примеру, для выполнения следующей по порядку инструкции требуется знать результат выполнения предыдущей инструкции (взаимозависимые инструкции), то в этом случае параллельное выполнение невозможно. Поэтому препроцессор прежде всего проверяет взаимозависимость команд и переупорядочивает их не в порядке поступления (out of order), а так, чтобы их можно было выполнять параллельно. На последних ступенях конвейера инструкции выстраиваются в исходном порядке.
Короткий конвейер, как, впрочем, и длинный, имеет свои сильные и слабые стороны. Чем больше количество ступеней, на которые разбит конвейер, тем меньшее количество работы выполняется на каждой ступени и, следовательно, тем меньше времени требуется для прохождения командой данной ступени. С учетом того, что каждая ступень выполняется за один процессорный такт, длинные конвейеры позволяют повышать тактовые частоты процессора, что невозможно в случае коротких конвейеров.
При коротком конвейере на каждой ступени процессор способен выполнять большее количество работы, однако на прохождение инструкции через каждую ступень конвейера здесь требуется больше времени, что ограничивает повышение тактовой частоты процессора. В этом случае увеличение числа команд, выполняемых за единицу времени, достигается за счет распараллеливания инструкций и наращивания исполнительных блоков процессора.
