- •8. Процессор
- •8.1. Базовые концепции
- •Ir← [[pc]]
- •8.2. Пересылка данных между регистрами
- •8.3. Выполнение арифметической или логической операции
- •8.4. Выборка слова из памяти
- •8.5. Сохранение слова в памяти
- •9. Конвейерная обработка команд
- •9.1. Базовые концепции
- •9.1.1. Роль кэш-памяти
- •9.1.2. Производительность конвейерной обработки команд
- •9.2. Очередь команд и упреждающая выборка
- •9.3. Конвейерная обработка и система команд
- •9.3.1. Режимы адресации
- •9.3.2. Коды условий
- •9.4. Тракты данных и управление
9.2. Очередь команд и упреждающая выборка
Промахи при обращении к кэш-памяти и команды перехода обуславливают приостановку конвейера на один и более тактов. Для сокращения отрицательных последствий этих событий во многие процессоры включают сложные блоки выборки, которые извлекают команды еще до того, как они понадобятся, и помещают их в очередь. Отдельный блок, называемый блоком диспетчеризации, пересылает команды, расположенные в начале очереди, блоку выполнения. Схема обработки команд таким процессором приведена на рис. 9.10. Помимо выборки команд из очереди блок диспетчеризации выполняет их декодирование.
Чтобы конвейер функционировал эффективно, блок выборки должен обладать мощными средствами декодирования и обработки команд, позволяющими распознавать и выполнять команды перехода. Его задача — постоянное формирование очереди команд, что уменьшит влияние на работу конвейера случайных задержек при выборке очередных команд. Если останов конвейера вызван конфликтом по данным, блок диспетчеризации не может передавать следующим ступеням команды из очереди. Это, однако, не мешает блоку выборки продолжать извлекать команды и помещать их в очередь. Когда задержка при выборке команды возникает из-за перехода или промаха во время обращения к кэшу, блок диспетчеризации может продолжать извлекать команды из очереди и передавать их следующим блокам для выполнения.
9.3. Конвейерная обработка и система команд
Не все команды одинаково хорошо подходят для конвейерного выполнения. Например, использование команд с побочными эффектами сопряжено с нежелательными зависимостями между данными. В настоящем разделе мы поговорим о связи между конвейерной обработкой команд и двумя важными характеристиками системы команд компьютера — режимами адресации и поддержкой флагов условий.
9.3.1. Режимы адресации
Набор поддерживаемых компьютером режимов адресации должен обеспечивать простой и эффективный доступ к самым разнообразным структурам данных. Широкую популярность завоевали индексный, косвенный, автоинкрементный и автодекрементный режимы. Многие процессоры позволяют по-разному их комбинировать, благодаря чему их системы команд являются более гибкими.
При выборе режимов адресации для конвейерного процессора следует принимать во внимание их воздействие на поток команд в конвейере. Особенно важно учитывать побочные эффекты автоинкрементной и автодекрементной адресации и вероятность приостановок конвейера из-за использования сложных режимов адресации. Кроме того, имеет значение, насколько часто тот или иной режим адресации будет применяться компилятором.
Для сравнения различных подходов к выбору режимов адресации давайте рассмотрим простую модель доступа к операндам в памяти. Выполнение команды Load X(R1),R2, предназначенной для загрузки данных из памяти, занимает пять тактов (рис. 9.5). Подобную команду
Load (R1),R2
способен выполнить 4-ступенчатый конвейер, поскольку она не требует вычисления адреса. Доступ к памяти может осуществляться на ступени E. В случае использования более сложного режима адресации при доступе к операнду не исключена необходимость в нескольких обращениях к памяти. Например, команда
Load (X(R1)),R2
может быть выполнена так, как показано на рис. 9.6, а, если считать, что смещение индекса, Х, задано в слове команды. После вычисления адреса на такте 3 процессору нужно дважды обратиться к памяти — прочитать слово по адресу X+[R1] на такте 4, а также слово по адресу [X+[R1]] на такте 5. Если содержимое регистра R2 является исходным операндом следующей команды, выполнение команды будет задержано на три такта. Эту цифру можно сократить до двух за счет продвижения операнда.
Для выполнения такой же операции загрузки с использованием только простейших адресных режимов потребуется несколько команд. На компьютере, где допускается использование трех операндов, это могут быть такие команды:
Add #X,R1,R2
Load (R2),R2
Load (R2),R2
Команда сложения выполняет операцию R2 ← Х + [Rl], а команды загрузки выбирают из памяти сначала адрес, а затем операнд. Этой последовательности команд требуется то же количество тактов, что и первой команде загрузки (рис. 9.6, 6).
Рассмотренный пример демонстрирует, что использование в конвейерном процессоре сложных режимов адресации, нуждающихся в нескольких обращениях к памяти, не всегда способствует ускорению работы программы. Их главными достоинствами являются сокращение количества команд, необходимых для решения конкретной задачи, и уменьшение занимаемого программой объема основной памяти. Наряду с указанными положительными характеристиками команды, реализующие сложные режимы адресации, имеют и недостаток, состоящий в их длительном выполнении, что приводит к задержке в работе конвейера и снижает ее эффективность. Кроме того, для их декодирования и выполнения необходимо аппаратное обеспечение соответствующей мощности. Да и компиляторам .непросто работать с такими командами.
а
б
Рис. 9.6. Эквивалентные операции с использованием режимов адресации:
сложного (а); простого (б)
Системы команд современных процессоров ориентированы на максимальное использование преимуществ конвейерной организации процессора. И поскольку сложные режимы адресации не годятся для конвейерного выполнения, их стараются не применять. Адресные режимы современных процессоров соответствуют следующим требованиям:
Для доступа к операндам выполняется не более одного обращения к памяти.
Обращение к памяти осуществляется только в командах загрузки данных из памяти (Load) и сохранения данных в памяти (Store).
Используемые адресные режимы не имеют побочных эффектов.
Этим требованиям соответствуют регистровый, косвенный регистровый и индексный режимы адресации. Первые два вообще не требуют вычисления адреса. В индексном режиме адрес может быть вычислен за один такт независимо от того, задано значение индекса в команде или регистре. Обращение к памяти производится на следующем такте. Перечисленные режимы адресации не имеют побочных эффектов за одним исключением. В некоторых архитектурах, в частности в процессорах ARM, разрешается записывать вычисленный в индексном режиме адрес обратно в индексный регистр. Это побочный эффект, нарушающий приведенные выше требования. Кроме того, обратите внимание на возможность использования относительной адресации, являющейся одной из разновидностей индексной адресации, при которой в качестве индексного регистра используется счетчик команд.
Три указанных выше правила впервые были реализованы в RISC-процессорах. Впервые в компьютерах с архитектурой SPARC, которая удовлетворяет выдвинутым в них требованиям.