Микроархитектура процессоров
В основе архитектуры любого процессора лежит несколько конструктивных элементов: кэш команд и данных, предпроцессор (Front End) и постпроцессор, называемый также блоком исполнения команд (Execution Engine). Процесс обработки данных состоит из нескольких характерных этапов. Прежде всего инструкции и данные забираются из кэша L1 (который разделен на кэш индукций и кэш данных). Эта процедура называется выборкой. После этого выбранные из кэша инструкции декодируются в понятные для данного процессора примитивы (машинные команды). Данная процедура называется декодированием.Далее декодированные команды поступают на исполнительные блоки процессора, выполняются, а результат записывается в оперативную память. Процессы выборки инструкций из кэша, их декодирование и продвижение к исполHительным блокам осуществляются в предпроцессоре, а процесс выполнения кодированных команд — в постпроцессоре. Таким образом, даже в самом простейшем случае команда проходит как минимум четыре стадии обработки: выборку из кэша; декодирование; выполнение запись результатов Данные стадии принято называть конвейером обработки команд. В нашем случае конвейер является четырехступенчатым. Важно, что каждую из этих ступеней команда должна проходить ровно за один такт. Соответственно для четырехступенчатого конвейера на выполнение одной команды отводится ровно четыре такта. Конечно, рассмотренный нами процессор является в определенной мере гипотетическим. В реальных процессорах конвейер обработки команд может быть более сложным и включать большее количество ступеней. Однако сама идеология построения процессора остается неизменной. Причина увеличения длины конвейера заключается в том, что многие команды являются довольно сложными и не могут быть выполнены за один такт процессора, особенно при высоких тактовых частотах. Поэтому каждая из четырех стадий обработки команд (выборка, декодирование, выполнение, запись) может состоять из нескольких ступеней конвейера. Собственно, длина конвейера является одной из наиболее значимых характеристик любого процессора. В случае «классического» гипотетического процессора исполнение кода процессором начинается с процесса выборки инструкций и данных из кэша L1. Однако для того, чтобы инструкции и данные попали в этот кэш, их нужно предварительно туда загрузить из оперативной памяти. Такой процесс называется предвыборкой данных и инструкций из оперативной памяти. В соответствии со схемой «классического» процессора процедура исполнения кода процессором начинается с выборки инструкций в формате х86 и данных из кэша L1. Инструкции х86 имеют переменную длину, причем информация о длине инструкций сохраняется в специальных полях в кэше инструкций L1. Загрузка инструкций переменной длины х86 из кэша L1 происходит блоками определенной длины, из которых в дальнейшем выделяются инструкции, которые подвергаются декодированию. Когда в потоке инструкций встречаются ветвления или переходы, выборка очередного блока инструкций производится с использованием механизма предсказания переходов. Всякий процессор в конечном счете должен быть сконструирован таким образом, чтобы за минимальное время выполнять максимальное количество инструкций. Именно количество выполняемых за единицу времени инструкций и определяет производительность процессора. Существуют два принципиально различных подхода к повышению производительности процессора (не считая, конечно, увеличения тактовой частоты). Суть первого заключается в том, чтобы за счет уменьшения длины конвейера увеличивать количество исполнительных блоков. Таким образом, по существу, реализуется множество параллельных коротких конвейеров. При этом постпроцессор работает по классической схеме: осуществляет выборку команд, их декодирование и отправку на множество исполнительных блоков. Такой подход позволяет в полной мере реализовать параллелизм на уровне инструкций (Instruction-Level Parallelism, ILP), когда несколько инструкций выполняются одновременно в различных исполнительных блоках процессора. Важно, что количество ступеней конвейера внутри постпроцессора (исполнительного блока) здесь невелико, поэтому инструкции выполняются за небольшое количество циклов. Для реализации параллелизма на уровне инструкций необходимо, чтобы поступающие на исполнительные блоки команды можно было выполнять параллельно, однако если, к примеру, для выполнения следующей по порядку инструкции требуется знать результат выполнения предыдущей инструкции (взаимозависимые СТрукции), то в этом случае параллельное выполнение невозможно. Поэтому предпроцессор прежде всего проверяет взаимозависимость команд и переупорядочивает их не в порядке поступления (out of order), а так, чтобы их можно было выполнять параллельно. На последних ступенях конвейера инструкции выстраиваются в исходном порядке. Короткий конвейер, как, впрочем, и длинный, имеет свои сильные и слабые стороны.Чем больше количество ступеней, на которые разбит конвейер, тем меньшее количество работы выполняется на каждой ступени и, следовательно, тем меньше времени требуется для прохождения командой данной ступени. С учетом того, что каждая ступень выполняется за один процессорный такт, длинные конвейеры позволяют повышать тактовые частоты процессора, что невозможно в случае коротких конвейеров. При коротком конвейере на каждой ступени процессор способен выполнять большее количество работы, однако на прохождение инструкции через каждую ступень конвейера здесь требуется больше времени, что ограничивает повышение тактовой частоты процессора. В этом случае увеличение числа команд, выполняемых за еденицу времени, достигается за счет распараллеливания инструкций и наращивания исполнительных блоков процессора. Современные процессоры умеют выполнять за один такт сразу несколько команд, и этот показатель постоянно увеличивается. При одинаковых значениях тактовой частоты и количестве ядер процессоры с более современной архитектурой будут работать значительно быстрее. Для обозначения внутренней архитектуры процессора разработчики дают их ядрам кодовые названия. Например, одноядерный процессор Celeron 430 (кодовое название ядра — Conroe-L) с тактовой частотой 1800 МГц работает приблизительно в два раза быстрее старых моделей Celeron с частотами 1700-2000 МГц, основанных на ядре Willamette или Northwood. Одна и та же версия ядра может претерпеть несколько модификаций, связанных с небольшими усовершенствованиями и исправлением ошибок. Модификации одного и того же ядра называют степпингами; процессор с более высоким степпингом обычно работает стабильнее своих предшественников и меньше греется.
|