
- •If (Interrupt Flag, бит 9) — флаг прерывания, определяющий реакцию процессора на запросы внешних прерываний по входу int (0 — прерывания запрещены, 1 — разрешены);
- •Способы адресации
- •Влияние команд на регистр флагов
- •Конвейерная обработка в процессоре Pentium
- •Развитие архитектуры Pentium
- •Расширенные регистры и типы данных процессоров x86
- •Дескрипторы
- •Порядок работы процессора в защищенном режиме
Конвейерная обработка в процессоре Pentium
Сущность конвейерной обработки
Конвейерная обработка (pipeline processing) в ЭВМ — вид обработки, при которой команда выполняется за несколько этапов, на каждом из которых используются определенные аппаратные средства процессора, работающие относительно независимо друг от друга так, что в течение одного и того же такта может выполняться несколько команд, находящихся на разных этапах.
При завершении первого этапа команда "переходит" на второй этап, на котором используются другие аппаратные средства. Средства, используемые на первом этапе, оказываются свободными для начала выполнения следующей команды. Таким образом, как только очередная команда переходит на следующий этап, начинает выполняться новая команда. Эта технология обеспечивает быструю обработку последовательных процессов, но требует дополнительного управляющего устройства, которое должно вести учет операций, выполняемых одновременно. Конвейерная архитектура присуща RISC-процессорам. Этапы конвейера выделяются в соответствии с действиями, необходимыми для выполнения команды. Конвейер может иметь два этапа (выборка — исполнение), три этапа (выборка — дешифрация — исполнение) и т. д. Наиболее характерное количество этапов — пять:
-
Выборка (предвыборка).
-
Декодирование.
-
Вычисление адресов операндов.
-
Исполнение.
-
Сохранение результатов.
Процессор с более, чем одним конвейером, называется суперскалярным.
Процессор с большим количеством этапов (стадий, ступеней) конвейера называется суперконвейерным. Например, в Pentium Pro два конвейера по двенадцать ступеней. Исполнительная часть содержит четыре блока: выборки и декодирования, выполнения, завершения и накопителя. Все команды в накопителе имеют определенный статус: "может быть выполнена", "ожидает данные", "выполнена" и т. д. Гиперконвейер (Pentium 4) имеет еще большее количество этапов.
Этапы конвейера процессоров Pentium и Pentium MMX
Целочисленные команды проходят при своем выполнении пять (для Pentium MMX шесть) этапов (стадий) конвейера (рис.):
-
PF — предвыборка (Prefetch);
-
F — выборка (Fetch) (только для Pentium MMX);
-
D1 — декодирование команды (Instruction Decode);
-
D2 — генерация адреса (Address Generate);
-
EX — исполнение — обращение к АЛУ и кэшу (Execute — ALU and Cache Access);
-
WB — обратная запись (сохранение результатов) (Writeback).
Рис. Конвейерная обработка в процессоре Pentium
Предвыборка
На стадии предвыборки команды выбираются из кэша кода или из памяти. На этой стадии участвуют два буфера предвыборки вместе с буфером флагов переходов. Каждый буфер предвыборки имеет размер строки кэша (line-size) — 32 байта. Это позволяет одному буферу предвыборки выбирать команды последовательно, а другому — в соответствии с предсказаниями BTB. Причем эти роли закреплены не жестко, а могут чередоваться. Команды выбираются первым буфером последовательно до тех пор, пока не будет выбрана команда перехода. После этого BTB предсказывает, произойдет переход или нет. Если предсказывается отсутствие перехода, выборка продолжает осуществляться последовательно (линейно). Если предсказывается переход, активизируется второй буфер и предвыборка начинает осуществляться им, как будто переход произошел. Если переход предсказан неверно, то после обнаружения этого конвейеры сбрасываются (flush) и выборка начинается заново.
В Pentium MMX имеются четыре 16-байтных буфера предвыборки, которые могут генерировать как максимум четыре независимых потока команд, основанных на предсказаниях BTB.
Выборка и декодирование команды
На стадии выборки осуществляется декодирование длины команды. Это заменяет дешифратор длины команды, используемый на стадии D1, и устраняет необходимость конечных битов (end-bits) для определения длины команды. На этой стадии декодируются также все префиксы.
Pentium MMX имеет буфер команд типа FIFO между стадиями F и D1. Этот буфер является прозрачным и не вносит задержки в случае, если он пустой. В каждом такте в него могут быть помещены две команды. Когда средняя скорость выполнения меньше, чем две команды за такт, буфер команд обычно заполнен.
На стадии D1 два параллельных декодера декодируют две очередные команды. Pentium требует дополнительного такта для декодирования префиксов команды.
Вычисление адресов операндов, выполнение команды и сохранение результатов
На стадии D2 вычисляются (генерируются) адреса операндов, находящихся в памяти.
На стадии выполнения в работу вступает АЛУ. При необходимости осуществляется доступ к кэшу данных, что требует более одного такта для прохождения этой стадии. На этой стадии все команды u-конвейера и все команды v-конвейера, за исключением команд условного перехода, верифицируются для правильного предсказания переходов.
На заключительной стадии (WB) команда может изменить состояние процессора и завершить выполнение. На этой стадии команды условного перехода v-конвейера верифицируются для правильного предсказания переходов.
При своем прохождении через конвейер команда может останавливаться до выполнения некоторых условий. Оба конвейера начинают и заканчивают стадии D1 и D2 одновременно. Когда команда в одном конвейере останавливается, то команда в другом конвейере останавливается на той же стадии. Таким образом, в стадию выполнения оба конвейера также входят одновременно.
Синхронизация выполнения команд в суперскалярных процессорах
В суперскалярных процессорах, как во всех параллельных системах возникает проблема синхронизации (координации или баланса взаимодействий). В таких процессорах последующая команда может закончиться раньше предыдущей. В этом случае результаты могут заноситься в буфер, из которого должны выходить уже в порядке очередности. Но это все хорошо и просто, когда команды независимы. Если выполнение очередной команды зависит от результатов предыдущей, то, ее выполнение должно приостановиться до получения требуемого результата. Существует два типа зависимостей:
-
Запись после чтения. Первая команда читает данные из регистра или памяти, вторая пишет в этот же регистр или ячейку памяти.
-
Чтение после записи. Обратная ситуация.
Существуют следующие методы уменьшения этих зависимостей:
-
Переименование регистров (register renaming).
-
Одновременное использование одних данных в обоих конвейерах (data forwarding).
-
Запоминание промежуточных результатов для дальнейшего использования (data bypassing).
Для реализации первого метода необходимо, чтобы число физических регистров было больше, чем программно-доступных. Например, имеем:
MOV AX, BX
MOV BX, CX
Можно вместо одного регистра BX использовать два регистра Reg0 и Reg1.
Переименование регистров не снимает зависимость второго типа. Полностью ее снять в принципе невозможно. Можно только уменьшить время простаивания второго конвейера.
Data forwarding заключается в следующем. Если первая команда выполняет какую-либо операцию, читая данные из памяти или регистра, а вторая использует эти же данные, то процессор выполняет операцию чтения и посылает результат на оба конвейера.
Data bypassing заключается в следующем. Если первая команда сохраняет результат в памяти, а вторая использует эту же ячейку памяти, то результат передается сразу на второй конвейер, что позволяет избежать операции чтения из памяти.
При переходе до получения нового адреса конвейер простаивает. Поэтому все переходы, встречающиеся в программе, запоминаются в специальном буфере флагов переходов (Branch Target Buffer, BTB). Процессор с вероятностью правильного предсказания 80-97% решает, будет производиться переход или нет, и начинает выполнять команды с предсказанного адреса. Это называется опережающим выполнением (Speculative Execution).