Под архитектурой процессора понимается его программная модель, то есть программно-видимые свойства. Под микроархитектурой понимается внутренняя реализация этой программной модели. Для одной и той же архитектуры IA-32 разными фирмами и в разных поколениях применяются существенно различающиеся микроархитектурные реализации, при этом, естественно, стремятся к максимальному повышению производительности (скорости исполнения программ).
В микроархитектуре процессоров Pentium (MMX) и их близких аналогов, Pentium Pro, Pentium II/III, Celeron, Pentium 4 – существенное значение имеет реализация различных способов конвейеризации и распараллеливания вычислительных процессов, а также других технологий, не свойственных процессорам прежних поколений. Рассмотрим основные процессы, реализуемые в современных процессорах.
Конвейеризация предполагает разбивку выполнения каждой инструкции на несколько этапов, причем каждый этап выполняется на своей ступени конвейера процессора. При выполнении инструкция продвигается по конвейеру по мере освобождения последующих ступеней. (Как только очередная команда переходит на следующий этап, начинает выполняться новая.) Таким образом, на конвейере одновременно может обрабатываться несколько последовательных инструкций, и производительность процессора можно оценивать темпом выхода вы полненных инструкций со всех его конвейеров. Для достижения максимальной производительности процессора – обеспечения полной загрузки конвейеров с минимальным числом лишних штрафных циклов – программа должна составляться с учетом архитектурных особенностей процессора. Конечно, и код, сгенерированный обычным способом, будет исполняться на процессорах классов Pentium достаточно быстро. Конвейер «классического» процессора Pentium имеет пять ступеней. Конвейеры процессоров с суперконвейерной архитектурой имеют большее число ступеней, что позволяет упростить каждую из них и, следовательно, сократить время пребывания в них инструкций. Гиперконвейер Pentium 4 имеет уже 20 ступеней.
Скалярным называют процессор с единственным конвейером, к этому типу относятся все процессоры Intel до 486 включительно. Суперскалярный процессор имеет более одного (Pentium II) конвейера, способных обрабатывать инструкции параллельно.
При введении второго конвейера возникает проблема зависимости данных. Если последующая инструкция выполняется быстрее предыдущей в параллельном конвейере, то она может закончиться раньше, нарушив очередность выполнения. Тем не менее, это возможно. При этом возникают ситуации, когда выполнение очередной команды зависит от результата предыдущей. В этом случае выполнение такой команды приостанавливается до тех пор, пока не будет получен требуемый результат, что снижает производительность процессора.
Переименование регистров позволяет обойти архитектурное ограничение на возможность параллельного исполнения инструкций (доступно всего восемь общих регистров). Процессоры с переименованием регистров фактически имеют более восьми общих регистров, и при записи промежуточных результатов устанавливается соответствие логических имен и физических регистров. Таким образом, одновременно могут исполняться несколько инструкций, ссылающихся на одно и то же логическое имя регистра, если, конечно, между ними нет фактических зависимостей по данным. Например, при параллельном выполнении команд
mov ax, bx
mov bx, cx
возникает подобная ситуация – запись в регистр bx может быть выполнена только после завершения операции записи его содержимого в ax. Переименование регистров позволяет для регистра bx использовать два внутренних регистра – Reg0 и Reg1. После такого дублирования можно одновременно и читать и записывать в него.
В ситуации, когда первая команда выполняет операцию, связанную с чтением из регистра, а вторая использует эти данные, но выполняется раньше, то процессор выполняет операцию чтения, посылая результат на оба конвейера.
Продвижение данных подразумевает начало исполнения инструкции до готовности всех операндов. При этом выполняются все возможные действия, и декодированная инструкция с одним операндом помещается в исполнительное устройство, где дожидается готовности второго операнда, выходящего с другого конвейера.
Предсказание переходов позволяет продолжать выборку и декодирование потока инструкций после выборки инструкции ветвления (условного перехода), не дожидаясь проверки самого условия. В процессорах прежних поколений инструкция перехода приостанавливала конвейер (выборку инструкций) до исполнения собственно перехода, на чем, естественно, терялась производительность. Предсказание переходов направляет поток выборки и декодирования по одной из ветвей. Статический метод предсказания работает по схеме, заложенной в процессор, считая, что переходы по одним условиям, вероятнее всего, произойдут, а по другим – нет. Динамическое предсказание опирается на предысторию вычислительного процесса – для каждого конкретного случая перехода накапливается статистика поведения, и переход предсказывается, основываясь именно на ней.
Исполнение по предположению, называемое также спекулятивным, идет дальше – предсказанные после перехода инструкции не только декодируются, но и по возможности исполняются до проверки условия перехода. Если предсказание сбывается, то труд оказывается ненапрасным, если не сбывается – конвейер оказывается недогруженным и простаивает несколько тактов (как минимум столько, сколько ступеней у конвейера).
Исполнение с изменением последовательности. При этом изменяется порядок внутренних манипуляций данными, а внешние (шинные) операции ввода-вывода и записи в память выполняются в порядке, предписанном программным кодом. Однако эта способность процессора в наибольшей степени может блокироваться несовершенством программного кода, если он генерируется без учета возможности изменения порядка исполнения инструкций.
Благодаря совершенствованию микроархитектуры от поколения к поколению возрастает производительность процессоров, причем этот рост обеспечивается двумя факторами. Во-первых, растет тактовая частота ядра. Каждая микроархитектура имеет свои пределы роста частоты. Во-вторых, сокращается число тактов процессорного ядра, требуемых на выполнение одной инструкции (в пересчете с темпа схода инструкций с конвейера). Так в среднем процессоры 1, 2, 3, 4, 5 и 6 поколений на одну инструкцию тратят 12, 5, 4, 2, 1 и 0,5 тактов. Полтакта на инструкцию – звучит, конечно, странно. Но если вспомнить о 8-байтной шине данных, позволяющей за один такт загрузить «кусок» кода, содержащего несколько команд, и о нескольких исполнительных устройствах, одновременно приступающих к их выполнению, то вопросы рассеиваются. Кроме того, в процессоры вводят все более мощные команды, позволяющие сокращать число инструкций, требуемое для решения одних и тех же задач.
Технология Hyper-Threading (HTT)
Технология Hyper-Threading представляет собой сравнительно недорогой с точки зрения увеличения площади процессорного ядра способ увеличения производительности процессоров.
В настоящее время, рынок полностью завоевали многозадачные операционные системы, идеология которых построена на одновременном существовании нескольких вычислительных потоков (threads), относящихся к одному или разным активным приложениям, либо к самой операционной системе. Если на многопроцессорных системах эти потоки могут выполняться одновременно (по одному на процессор), то в однопроцессорных системах CPU вынуждены непрерывно переключаться между потоками, квантуя процессорное время между исполнением их различных частей.
В частности, хотя Pentium 4 и содержит четыре параллельных блока для операций с целыми числами, два блока для работы с вещественными числами и два блока для работы с памятью, одновременно все эти ресурсы практически никогда не используются. В подавляющем большинстве случаев существенная часть процессора простаивает либо в ожидании данных, либо из-за ее ненужности при исполнении очередной операции.
Таким образом, если разрешить процессору одновременное выполнение более чем одного потока, его мощности можно загрузить более эффективно. Именно в этом и состоит основная идея Hyper-Threading. Благодаря технологии Hyper-Threading один физический процессор воспринимается операционной системой и приложениями как два логических процессора. Соответственно, операционная система и приложения предполагают, что CPU с технологией Hyper-Threading может одновременно выполнять два потока и загружает такой процессор работой гораздо сильнее.
Сам же процессор при этом подвергнут лишь незначительным изменениям и использует для выполнения второго потока свои простаивающие блоки. Hyper-Threading – технология действенна только в многозадачных и многопоточных средах.
Поскольку физический процессор с технологией Hyper-Threading представляет собой два логических CPU, в таких процессорах продублированы некоторые блоки. Причем, дубляжу подверглись лишь отдельные управляющие элементы, основные же исполнительные ресурсы остались теми же – теперь они попросту загружаются более плотно и эффективно.
Таким образом, технология Hyper-Threading действительно позволяет загрузить исполнительные устройства процессора значительно сильнее за счет одновременного выполнения двух потоков. Однако эффект от такого приема может быть положительным, если выполняемые потоки не похожи по типу выполняемых инструкций.
Поддержка технологии Hyper-Threading необходима не только со стороны программного обеспечения и операционной системы, но и со стороны аппаратного обеспечения (поддержка со стороны материнской платы и BIOS).