Блок выполнения команд

Блок выполнения команд спроектирован, как уже указывалось, по технологии RISC-процессора с тем, чтобы наиболее часто встречающиеся команды выполнялись максимально быстро, возможно, за счет увеличения времени выполнения редко встречающихся команд.

В первых процессорах строго выполнялся принцип последовательного выполнения команд фон Неймана, т.е. первый этап очередной команды начинал выполняться только тогда, когда был закончен последний этап выполнения предыдущей команды. В современных процессорах используется так называемая конвейерная обработка команд, когда первый этап следующей команды начинает выполняться сразу же после окончания первого этапа предыдущей команды. В этом случае быстродействие процессора существенно увеличивается за счет одновременного (параллельного) выполнения команд. Процессоры, в которых выполнение команды разбивается на этапы, называются суперскалярными, а процессоры, в которых функционирует несколько конвейеров команд, называются суперконвейерными.

Блок выполнения команд содержит узел ядра, узел освобождения ресурсов и станцию резервирования (RS).

Узел ядра содержит четыре порта (с номерами от 0 до 3) и 16 исполняющих элементов, каждый из которых выполняет свою группу микрокоманд для команд x86, x87 и мультимедийных команд.

При каждом такте процессор распределяет (диспетчирует) до 6 микрокоманд для выполнения на один из портов. При этом на порт 0 направляются микрокоманды, выполняющие арифметические и логические операции, команды сохранения и команды перехода для целых чисел, а также команды перемещения, сохранения и обмена для чисел с плавающей точкой. Микрокоманды, выполняющие арифметические операции над целыми числами, могут быть направлены и на порт 1. На этот порт направляются микрокоманды для выполнения сдвига, а также остальные микрокоманды, реализующие команды набора x87 и мультимедийные команды. На порты 2 и 3 направляются микрокоманды, реализующие соответственно загрузку из памяти и сохранение в памяти.

При диспетчеризации микрокоманд учитывается не время их поступления в ядро процессора, а наличие данных и ресурсов для их выполнения. Если макрокоманды не готовы к выполнению, они помещаются в станцию резервирования (Reservation Station), откуда забираются при поступлении данных и наличии ресурсов для их выполнения. Таким образом, микрокоманды, поступившие раньше, могут быть выполнены позже.

Каждый из портов образует свой конвейер, функционирующих параллельно и независимо друг от друга, образуя в целом суперконвейерную систему из четырех конвейеров. Каждый конвейер содержит 20 этапов.

На этапах 1 и 2 команда загружается либо из памяти BTB блока предсказания переходов, если эта команда уже выполнялась (например, в предыдущей итерации цикла), либо загружается из кэш-памяти L2 или L3, либо из оперативной памяти.

На этапах 3 и 4 микрокоманды выполняемой команды загружаются из кэш-памяти ETC.

На этапах 5 и 6 до трех декодированных микрокоманд проходят через таблицу назначения регистров – RAT (Register Allocation Table). На этих этапах определяются необходимые для выполнения команды регистры и вместо логических регистров, используемых в программе, например, регистра EAX, команде на этапах 7 и 8 назначаются физические регистры (в процессорах архитектуры NetBurst имеется 128 физических регистров). Такое переназначение необходимо потому, что параллельно выполняемые команды могут затребовать одни и те же логические регистры.

На этапе 9, перед тем как планировщик выполнения команд выделит один из 16 узлов выполнения команд для выполнения данной команды, она ставится в очередь, а затем на этапах 10, 11 и 12 планировщик определяет необходимые для команды ресурсы. После этого на этапах 13 и 14 команде выделяются необходимый узел выполнения команд.

На этапах 15, 16, 17 и 18 микрокоманда выполняется, а результаты ее выполнения передаются узлу освобождения ресурсов.

На этапе 19 выполняется сравнение предсказанного перехода с реальным переходом и на этапе 20 результат проверки посылается в память BTB блока предсказания переходов.

Узел освобождения ресурсов принимает результаты выполнения операций и обрабатывает их таким образом, чтобы они соответствовали первоначальному порядку поступления команд в ядро. Результаты, полученные при выполнении команды, посылаются в память или логические регистры и, кроме того, проверяются и определяются флажки, используемые в команде. После того, как микрокоманда записывает свой результат, она освобождает ресурсы и записывается в буфер переупорядочения (ReOrder Buffer). Узел освобождения ресурсов также следит за переходами в выполняемой программе и посылает информацию об изменении адресов перехода блоку предсказания переходов.