P6 — суперскалярная суперконвейерная архитектура, разработанная компанией Intel и лежащая в основе микропроцессоров Pentium Pro, Pentium II, Pentium III, Celeron и Xeon. В отличие от x86-совместимых процессоров предыдущих поколений с CISC-ядром, процессоры архитектуры P6 имеют RISC-ядро, исполняющее сложные инструкции x86 не напрямую, а предварительно декодируя их в простые внутренние микрооперации.

Первым процессором архитектуры P6 стал анонсированный 1 ноября 1995 года процессор Pentium Pro, нацеленный на рынок рабочих станций и серверов. Процессоры Pentium Pro выпускались параллельно с процессорами архитектуры P5 (Pentium и Pentium MMX), предназначенными для персональных компьютеров. 7 мая 1997 года компанией Intel был анонсирован процессор Pentium II, пришедший на смену процессорам архитектуры P5.

В 2000 году на смену архитектуре P6 на рынке настольных и серверных процессоров пришла архитектура NetBurst, однако архитектура P6 получила своё развитие в мобильных процессорах Pentium M и Core. В 2006 году на смену процессорам архитектуры NetBurst пришли процессоры семейства Core 2 Duo, архитектура которых также представляет собой развитие архитектуры P6.

Функциональные устройства

Процессоры архитектуры P6 состоят из четырёх основных подсистем:

Подсистема упорядоченной предварительной обработки () — отвечает за выборку и декодирование инструкций в порядке, предусмотренном программой, и предсказывает переходы. Ядро исполнения с изменением последовательности () — отвечает за исполнение микроопераций в оптимальном порядке и организует взаимодействие исполнительных устройств. Подсистема упорядоченного завершения () — выдаёт результаты исполнения в порядке, предусмотренном программой. Подсистема памяти () — обеспечивает взаимодействие процессора с оперативной памятью.

Подсистема упорядоченной предварительной обработки

К устройствам этой подсистемы относятся:

Модуль и буфер предсказания переходов (Branch Target Buffer, BTB) — предсказывают переходы и хранят таблицу истории переходов. Для предсказания используются как динамический, так и статический методы. Последний используется в том случае, если динамическое предсказание невозможно (в таблице переходов отсутствует необходимая информация). Декодер инструкций (Instruction Decoder) — преобразует CISC-инструкции x86 в последовательность RISC-микроопераций, исполняемых процессором. Включает два декодера простых инструкций (Simple), обрабатывающих команды, которые могут быть выполнены одной микрооперацией, и декодер сложных инструкций (Complex), обрабатывающего команды, для которых нужно несколько (до четырёх) микроопераций. Планировщик последовательностей микроопераций (Microcode sequencer) — хранит последовательности микроопераций, используемые при декодировании сложных инструкций x86, требующих более четырёх микроопераций. Блок вычисления адреса следующей инструкции (Next IP Unit) — вычисляет адрес инструкции (), которая должна быть обработана следующей, на основании информации о прерываниях и таблицы переходов. Блок выборки инструкций (Instruction Fetch Unit, IFU) — осуществляет выборку инструкций из памяти по адресам, подготовленным блоком вычисления адреса следующей инструкции.

Процессоры на ядре Tualatin дополнительно содержат блок предвыборки инструкций (Prefetcher), который осуществляет предварительную выборку инструкций на основании таблицы переходов.

Ядро исполнения с изменением последовательности

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

Таблица назначения регистров (Register Alias Table) — задаёт соответствие между регистрами архитектуры x86/IA32 (Intel Architecture 32-bit) и внутренними регистрами, используемыми при исполнении микроопераций. Буфер переупорядочивания микроопераций (Reorder Buffer) — обеспечивает выполнение микроопераций в оптимальной с точки зрения производительности последовательности. Станция-резервуар (Reservation Station) — содержит инструкции, отправляемые на исполнительные устройства.

К исполнительным устройствам ядра относятся:

Арифметико-логические устройства, АЛУ (Arithmetic Logic Unit, ALU) — выполняют целочисленные операции. Блок арифметики с плавающей запятой (Floating Point Unit, FPU) — выполняет операции над числами с плавающей точкой. Процессоры Pentium III и выше имеют также блок, осуществляющий исполнение инструкций SSE (SIMD FPU). Блок генерации адресов (Address Generation Unit, AGU) — вычисляет адреса данных, используемых инструкциями, и формирует запросы к кэшу для загрузки/выгрузки этих данных.

Подсистема упорядоченного завершения

Регистровый файл (Register File) — хранит результаты операций (состояние регистров IA32 для исполняемых инструкций). Буфер переупорядочивания памяти (Memory Reorder Buffer) — управляет порядком записи данных в память для предотвращения записи неверных данных из-за изменения порядка выполнения инструкций. Блок завершения (Retirement Unit) — выдаёт результаты исполнения инструкций в той последовательности, в которой они поступили на исполнение.

Подсистема памяти

Объём L2 процессоров архитектуры P6 Объём (Кб) Процессоры 0 Celeron Covington 128 Celeron (Mendocino, Coppermine-128), Pentium III (Coppermine для приставки XboxВ отличие от процессора Celeron на ядре Coppermine-128, имеющего 4-канальный ассоциативный кэш второго уровня, у этого процессора кэш 8-канальный. См.: «Мир игровых консолей. Часть пятая», журнал Upgrade, 2007, № 28 (325), стр. 24) 256 Pentium Pro, Pentium III (Coppermine, Tualatin-256), Xeon (Cascades) 512 Pentium Pro, Pentium II, Pentium III (Katmai, Tualatin), Xeon (Drake, Tanner) 1024 Pentium Pro, Xeon (Drake, Tanner) 2048 Xeon (Drake, Tanner, Cascades 2MB) Подсистема памяти осуществляет взаимодействие с оперативной памятью. К этой подсистеме относятся:

Кэш первого уровня для данных (Level 1 Data Cache, L1D) — память с малым временем доступа объёмом 8 (для Pentium Pro) или 16 (для более новых процессоров) килобайт, предназначенная для хранения данных. Кэш первого уровня для инструкций (Level 1 Instruction Cache, L1I) — память с малым временем доступа объёмом 8 (Pentium Pro) или 16 килобайт, предназначенная для хранения инструкций. Кэш второго уровня (Level 2 Cache, L2). Память с малым временем доступа объёмом 128, 256, 512, 1024 или 2048 килобайт. Ширина шины L2 составляет 64 или 256 (для процессоров на ядре Coppermine и выше) бит. Процессоры Celeron на ядре Covington кэша второго уровня не имеют. Блок шинного интерфейса (Bus Interface Unit) — управляет системной шиной.

Исполнение инструкции Конвейер процессора Pentium Pro Конвейер состоит из 12 стадий: IOFE(1—4) — определение адреса инструкции и её выборка. IOFE(4—6) — декодирование. IOFE7 — переименование регистров. IOFE8 — запись микроопераций в станцию-резервуар. O2C1 — передача микроопераций из станции-резервуара к исполнительным блокам. O2C2 — исполнение микроопераций (один или несколько тактов). IOR(1—2) — завершение инструкции: запись результатов в регистры. Исполнение инструкции начинается с её выборки и декодирования. Для этого из кэш-памяти инструкций первого уровня по адресу из буфера предсказания переходов выбирается 64 байта (две строки). Из них 16 байт, начиная с адреса из блока вычисления адреса следующей инструкции, выравниваются и передаются в декодер инструкций, преобразующий инструкции x86 в микрооперации. Если инструкции соответствует одна микрооперация, декодирование проводит один из декодеров простых инструкций. Если инструкции соответствует две, три или четыре микрооперации, декодирование проводит декодер сложных инструкций. Если же инструкции соответствует большее число микроопераций, то они формируются планировщиком последовательностей микроопераций.

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

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

Особенности архитектуры Первые процессоры архитектуры P6 в момент выхода значительно отличались от существующих процессоров. Процессор Pentium Pro отличало применение технологии динамического исполнения (изменения порядка исполнения инструкций), а также архитектура двойной независимой шины (), благодаря чему были сняты многие ограничения на пропускную способность памяти, характерные для предшественников и конкурентов. Тактовая частота первого процессора архитектуры P6 составляла 150 МГц, а последние представители этой архитектуры имели тактовую частоту 1,4 ГГц. Процессоры архитектуры P6 имели 36-разрядную шину адреса, что позволило им адресовать до 64 ГБ памяти (при этом линейное адресное пространство процесса ограничено 4 ГБ, см. PAE).

Суперскалярный механизм исполнения инструкций с изменением их последовательности

Принципиальным отличием архитектуры P6 от предшественников является RISC-ядро, работающее не с инструкциями x86, а с простыми внутренними микрооперациями. Это позволяет снять множество ограничений набора команд x86, таких, как нерегулярное кодирование команд, переменная длина операндов и операции целочисленных пересылок регистр-память. Кроме того, микрооперации исполняются не в той последовательности, которая предусмотрена программой, а в оптимальной с точки зрения производительности, а применение трёхконвейерной обработки позволяет исполнять несколько инструкций за один такт.

Суперконвейеризация

Процессоры архитектуры P6 имеют конвейер глубиной 12 стадий. Это позволяет достигать более высоких тактовых частот по сравнению с процессорами, имеющими более короткий конвейер при одинаковой технологии производства. Так, например, максимальная тактовая частота процессоров AMD K6 на ядре (глубина конвейера — 6 стадий, 180-нм технология) составляет 550 МГц, а процессоры Pentium III на ядре Coppermine способны работать на частоте, превышающей 1000 МГц.

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

Двойная независимая шина

С целью увеличения пропускной способности подсистемы памяти в процессорах архитектуры P6 применяется двойная независимая шина. В отличие от предшествующих процессоров, системная шина которых была общей для нескольких устройств, процессоры архитектуры P6 имеют две раздельные шины: Back side bus, соединяющую процессор с кэш-памятью второго уровня, и Front side bus, соединяющую процессор с северным мостом набора микросхем.

Достоинства