- •9.5. Суперскалярная обработка команд
- •9.5.1. Внеочередное завершение команд
- •9.5.2. Завершение выполнения
- •9.5.3. Операция диспетчеризации
- •9.6 Семейство процессоров Intel ia-32
- •9.6.1. Сегментация памяти для семейства процессоров ia-32
- •9.6.2. 16-Разрядный режим
- •9.6.3. Процессоры 80386 и 80486
- •9.6.4. Процессор Pentium
- •9.6.5. Процессор Pentium Pro
- •9.6.6. Процессоры Pentium II и Pentium III
- •9.6.7. Процессор Pentium 4
- •9.6.8. Технология Hyper-Threading от Intel Производительности всегда мало
- •Hyper-Threading
- •Углубляемся в технологию
- •Максимум эффективности от Hyper-Threading
- •9.6.9. Архитектура ia-64
- •Описание ia-64
- •Архитектура е2к
9.5.3. Операция диспетчеризации
Давайте вернемся к процессу диспетчеризации команд. Принимая решение о диспетчеризации, соответствующий блок должен гарантировать, что все нужные команде ресурсы доступны. Например, должны быть свободны временные регистры, поскольку в них могут записываться результаты выполнения команды. Их резервирование для определенной команды является частью процесса диспетчеризации. Кроме того, необходим доступ к буферу реорганизации. Когда команда получает в свое распоряжение весь спектр ресурсов, включая блок выполнения, она диспетчеризируется для выполнения.
Можно ли диспетчеризировать команды не по порядку? Чтобы ответить на этот вопрос, обратимся к рис. 9.11, б. Если, например, вывод команды I2 будет отложен из-за промаха при обращении к кэш-памяти за ее исходным операндом, на такте 4 целочисленный блок окажется занятым, и подготовка команды I4 к выполнению станет невозможной. Корректна ли в этом случае диспетчеризация команды I5? В принципе, да, если для команды I4 в буфере реорганизации зарезервировано место, что обеспечит выход команд из конвейера в правильном порядке. Однако внеочередная диспетчеризация команд требует большой осторожности. Приступая к ней, нужно иметь гарантию, что не произойдет взаимоблокировки.
Взаимоблокировкой называется ситуация, когда два блока, скажем А и В, совместно используют один ресурс. Предположим, блок В не может завершить работу до тех пор, пока блок А не закончит свою. В то же время блоку В выделен ресурс, который нужен блоку А. При таком раскладе ни один из двух блоков не сможет решить свою задачу. Блок А будет ожидать освобождения ресурса, а блок В, «оккупировавший» нужный ресурс, — завершения работы блока А.
Рассмотрим, вследствие чего происходит взаимоблокировка, если команды диспетчеризируются не по порядку. Допустим, процессор имеет только один временный регистр, который резервируется для команды I5, когда она диспетчеризируются. Из-за этого нельзя подготовить к выполнению команду I4, которая ждет освобождения временного регистра, а его невозможно освободить, пока команда I5 не покинет процессор. В свою очередь, команда I5 не покинет процессор прежде, чем это сделает команда I4. Таким образом, налицо взаимоблокировка.
Для предотвращения взаимоблокировок диспетчер должен учитывать множество факторов. Поэтому при обеспечении поддержки внеочередного выполнения команд значительно усложняется блок диспетчеризации. Кроме того, увеличивается время, затрачиваемое на принятие решения о диспетчеризации. Вот почему в большинстве процессоров команды подготавливаются к выполнению по порядку. Порядок соблюдается на выходе из диспетчера и на выходе из конвейера. Между этими двумя точками допускается обработка команд с разной скоростью.
Примером удачного применения описанных в этой главе технологий и разрешения многих из перечисленных проблем, является процессор UltraSPARC II — коммерчески успешный суперскалярный процессор с высокой степенью конвейеризации команд.
9.6 Семейство процессоров Intel ia-32
Процессоры Intel пользуются большим успехом и широко применяются в ноутбуках и персональных компьютерах. В 1980-х годах фирма Intel выпустила первую серию процессоров для использования в IBM PC. Они базировались на процессоре 8086, созданном в 1979 году, который генерировал на внешней шине 20-битовые адреса, а также оперировал 16-разрядными данными. (В первом IBM PC использовалась недорогая 8-разрядная версия процессора 8086, называвшаяся 8088.) Поскольку процессор 8086 был заключен в 40-контактный корпус, адреса и данные мультиплексировались на одни и те же контакты.
Архитектура процессоров Intel постоянно совершенствовалась, на основе базовой системы команд выпускались все более мощные процессоры. Эволюционный ряд включает процессоры 80286, 80386, 80486, а также процессоры текущей серии Pentium. Процессор 80286 был 16-разрядным, последующие процессоры оперировали 32-разрядными адресами и данными. Первым представителем семейства IA-32 стал процессор 80386. Благодаря тому что 32-разрядные микросхемы выпускаются в виде модулей большего размера, исчезла необходимость в мультиплексировании линий адреса и данных.