Выполнение команд в МП происходит под управлением устройства управления (УУ). В общем случае выполнение команды состоит из следующих основных шагов:
  1. Загрузка команды из ЗУ.
  2. Дешифрация команды.
  3. Загрузка операндов из ЗУ в случае, если это необходимо.
  4. Собственно выполнение команды (если команда предполагает вычисления, на этом этапе задействуется АЛУ микропроцессора).
  5. Сохранение результата в ЗУ, если это необходимо (в команде может быть предусмотрено сохранение результата во внутренних регистрах процессора).
Конвейеризация выполнения команд предполагает разбиение процесса на подоперации и выполнение этих подоперации отдельными блоками, входящими в состав устройства управления.
Предварительная загрузка команд, очередь команд
В простейших микропроцессорах загрузка команды и ее исполнение в АЛУ выполняются последовательно. Это приводит к неэффективной организации работы процессора: во время загрузки команды "простаивает" АЛУ, а во время исполнения — УУ. Идея заключается в том, чтобы сделать процессы выполнения команды и загрузки следующей команды одновременными. Это можно сделать, если в то время, пока АЛУ выполняет некую команду, устройство управления будет загружать следующую команду для исполнения. В составе устройства управления появляется блок предварительной загрузки команд, а процесс выполнения команды в МП становится конвейеризированным в простейшем виде (рис. 1).
Рис. 1.  
Команды, загруженные в МП на этапе предварительной выборки, необходимо временно сохранить до тех пор, пока не станет возможным их исполнение в АЛУ. Для временного сохранения используются специальные регистры, получившие название "очередь команд".
Использование предварительной выборки позволяет передавать очередную команду на выполнение в АЛУ сразу же после окончания выполнения предыдущей команды, таким образом АЛУ не простаивает в ожидании загрузки очередной команды и общая эффективность работы МП повышается.
Первичная дешифрация, предсказание переходов
Предварительная выборка и очередь команд прекрасно работают до тех пор, пока команды лежат в ЗУ подряд, одна за другой. Как только порядок выполнения команд нарушается (в результате условного или безусловного перехода), возникает необходимость очистить очередь команд и снова заполнить ее, но уже начиная с нового адреса выполнения. Очевидно, что на это потребуется некоторое время. Если в программе много команд переходов, потери на перезагрузку очереди команд могут оказаться достаточно велики и даже свести на нет тот выигрыш, который достигается за счет использование самой очереди команд.
Появляется необходимость специальной обработки команд переходов — при обнаружении такой команды, блок предварительной выборки должен, в идеале, попытаться определить адрес следующей команды с учетом перехода.
Прежде всего, необходимо определить, что загруженная команда является командой перехода. Для этого используется первичная дешифрация (рис. 2).
Рис. 2.  
Задача первичной дешифрации — проанализировать код операции очередной команды, и если это команда перехода — приостановить заполнение очереди команд до момента выполнения команды перехода, когда станет ясно, какая же команда будет выполняться следующей. Однако такое решение неэффективно, так как оно приводит к простою блока предварительной выборки. Гораздо эффективнее было бы попытаться предсказать адрес перехода.
Определение адреса перехода
Самым простым случаем здесь является безусловный переход (или вызов подпрограммы). В команде безусловного перехода всегда непосредственно указывается адрес команды, которая должна быть выполнена следующей. В этом случае блок предсказания переходов сообщает этот адрес блоку предварительной выборки команд, заставляя его произвести выборку следующей команды по новому адресу (рис. 3).
Рис. 3.  
Обратите внимание, что здесь мы видим пример конвейера с обратной связью.
В случае условного перехода (команды ветвления) всё несколько сложнее, так как до момента выполнения команды неизвестно, будет ли выполняться собственно переход по адресу, указанному в команде, или порядок выполнения команд не измениться. В этом случае делается попытка предсказать (с какой-то долей вероятности), как будет выполняться программа. Если в результате предсказания получается большая вероятность перехода, блок предсказания воздействует на блок предварительной выборки команд, заставляя его произвести выборку следующей команды по новому адресу.
Существуют два метода предсказания переходов: статический и динамический.
Статический метод предсказания работает по схеме, заложенной в процессор, считая, что переходы по одним условиям вероятнее всего произойдут, а по другим — нет.
Динамический метод предсказания опирается на предысторию вычислительного процесса — для каждого конкретного случая перехода накапливается статистика поведения, и переход предсказывается, основываясь именно на ней.
Поскольку предсказание переходов базируется на вероятностных оценках, оно не всегда работает правильно. Однако, если программа специальным образом оптимизирована (с учетом особенностей конкретного процессора), если использование команд переходов в программе согласовано логически с алгоритмом работы блока предсказания, предсказание переходов позволяет существенно повысить эффективность работы исполнительного конвейера МП.
Предварительная загрузка операндов
После того, как АЛУ закончило выполнение очередной команды, в него загружается новая команда из очереди команд. Но в этот момент может оказаться, что для выполнения команды необходимо загрузить из ЗУ один или несколько операндов. На их загрузку требуется определенное время, в течение которого АЛУ простаивает. Для того, чтобы этого не происходило, нужно ввести в наш конвейер (рис. 3) еще одну операцию — предварительную загрузку операндов. Для того чтобы определить, есть ли в данной команде операнды, загружаемые из ЗУ, производится вторичная дешифрация (рис. 4).
Рис. 4.  
Загруженные операнды сохраняются в специальных внутренних регистрах МП, таким образом, к моменту окончания АЛУ выполнения предыдущей команды, очередная команда и все необходимые данные уже загружены в МП. Такая организация конвейера позволяет с максимальной эффективностью использовать мощности АЛУ и всего процессора в целом.
Буферизация результата
Выполнение команды приводит к получению результата. В ряде случаев этот результат также должен быть сохранен в ЗУ. Так как сохранение результата не имеет отношения к собственно выполнению команды, оно выносится в виде отдельной подоперации нашего конвейера. АЛУ, выполнив команду, сохраняет результат в промежуточном внутреннем буфере, блок сохранения результата на следующем шаге конвейера выполняет его запись в ЗУ (рис. 5).
Рис. 5.  
Микропроцессоры, имеющие конвейер выполнения команд, изображенный на рис. 5, получили название "МП со скалярной архитектурой". Дальнейшая эволюция микропроцессоров пошла по пути создания суперскалярной архитектуры, в которой использовалось более одного конвейера и несколько АЛУ. Таким образом, стало возможным одновременное выполнение нескольких команд, не связанных друг с другом по данным.
Примечание 1
Получение максимальной эффективности использования скалярной архитектуры МП возможно только в случае специальной оптимизации программы под конкретный МП с учетом его архитектуры и особенностей функционирования отдельных блоков конвейера.