В тестовой лаборатории «КомпьютерПресс» проведено тестирование современных процессоров для ПК. Среди них процессоры AMD-K6-2 266, 300, 333 и 350, Cyrix M II-300 и —333, Intel Celeron 300, 300A, 333 и 366, Intel Pentium II 233, 266, 300, 333, 350, 400 и 450, Intel Xeon 400 с L2-кэшем объемом 512 и 1024 Кбайт, Alpha KP21164-533CN и —633CN.
Процессоры для IBM-совместимых компьютеров
Идентификация процессоров Intel
Линейка процессоров Pentium II
Микроархитектура процессоров семейства P6
Микроархитектура процессора AMD-K6-2
Наборы инструкций MMX и 3DNow!
Особенность сегодняшней ситуации на рынке процессоров для IBM-совместимых ПК состоит в том, что между основными производителями процессоров развернулась жесткая конкурентная борьба за свое место под солнцем. В первую очередь это касается компаний Intel и AMD, соперничество между которыми особенно обострилось после выпуска процессора AMD-K6-2, ставшего достойным конкурентом процессорам линеек Intel Pentium II и Intel Celeron. Другие производители x86-совместимых процессоров также не стоят на месте — прежде всего это Cyrix и IDT. Таким образом, вполне естественным представляется вопрос о том, что же предлагают сейчас производители клонов и способна ли их продукция конкурировать с процессорами Intel.
Цель проведенного нами тестирования заключалась в том, чтобы сравнить производительность современных x86-совместимых процессоров и выяснить их возможности при решении тех или иных задач. Не стоит рассматривать результаты, приведенные здесь, как исчерпывающее руководство по выбору процессора для своего ПК, поскольку производительность — лишь одна из характеристик процессора, хотя и немаловажная. В ряде случаев гораздо существеннее полная программная совместимость, способность работать в данном аппаратном окружении, энергопотребление и другие показатели.
Мы попытались сравнить все современные процессоры для IBM-совместимых персональных компьютеров, представленные на московском рынке. Еще раз оговоримся, что нами принимались в расчет только производительность и стоимость процессоров. Вопросы совместимости и надежности — как в смысле отсутствия в микрокоде процессора серьезных ошибок, так и в смысле корректности работы с рядом системных плат, — нами специально не исследовались, и потому в этой статье не рассматриваются.
Идентификация процессоров Intel
Прежде, чем перейти непосредственно к детальному обсуждению характеристик и особенностей современных процессоров Intel, необходимо немного рассказать о том, как маркируются процессоры Intel, и как по идентификационным кодам можно определить те или иные свойства конкретного экземпляра процессора.
На сегодняшний день на рынке комплектующих для IBM-совместимых компьютеров имеется большое количество процессоров от Intel самых разных модификаций. В этом разнообразии легко запутаться, поэтому уже в то, ныне далекое время, когда выпускались 386 процессоры, Intel ввел специальный идентификационный код, по которому можно было бы установить марку процессора — CPUID (в официальной документации Intel также используется термин «Processor Signature»). Идентификатор CPUID представляет собой 14-битное число, в котором в закодированном виде хранится информация о типе (Type) — 2 старших бита с 12 по 13, семействе (Family) — 4 бита с 8 по 11, модели (Model) — 4 бита с 4 по 7, а также ревизии (Stepping) процессора — 4 младших бита с 0 по 3. Так, например, для процессоров Pentium Pro CPUID равен 061x, а для Pentium II — 063x или 065x.
Все современные процессоры Intel поддерживают инструкцию CPUID, с помощью которой можно «запросить» у процессора его идентификатор CPUID. Помимо этого, инструкция CPUID позволяет узнать, поддерживает ли процессор ряд дополнительных функций (MMX, APIC и.т.д.), а также характеристики L1- и L2-кэша. Некоторые ранние модели процессоров Intel эту инструкцию не поддерживали.
Кроме CPUID, для определения модификации процессора используются также еще два идентификатора: S-Spec и маска процессора («mask»). В официальной документации Intel вместо термина «mask» используется термин «core stepping» — ревизия ядра, что лучше отражает суть этого идентификатора.
Маска (ревизия ядра) процессора обозначает версию ядра процессора. Различие в маске между двумя процессорами говорит о том, что в ядрах этих процессоров «прошит» разный микрокод.
S-Spec — это идентификатор, который однозначно определяет функциональные, электрические, технологические характеристики и тип упаковки конкретного экземпляра процессора. Безусловно, S-Spec — самый важный из трех рассмотренных идентификаторов: зная его, можно узнать CPUID, маску, рабочую частоту ядра процессора, размер L2-кэша и некоторые другие характеристики процессора: таблицы с соответствующей информацией публикуются на одном из www-узлов Intel и регулярно обновляются. Значение S-Spec обязательно присутствует в маркировке, наносимой на картридж или корпус процессора. Однако S-Spec нигде не «прошивается» в ядре процессора, что, на самом деле, дает лишний повод для подделки процессоров путем их перемаркировки. Например, если процессор поддается разгону и устойчиво работает на частотах выше официально заявленной, то достаточно изменить его маркировку в соответствии с этой повышенной частотой, и тогда вполне возможна ситуация, когда поддельный разогнанный процессор будет неотличим от настоящего. Все было бы совсем иначе, если идентификатор S-Spec прошивался бы где-нибудь в процессоре и его можно было прочитать — наподобие CPUID. В этом случае подделать процессор было бы намного труднее (или вообще невозможно).
Процессоры Intel
Самый младший из всех процессоров, выпускаемых на сегодняшний день компанией Intel, появился на рынке в январе 1997. Это был Intel Pentium MMX — первый процессор, который поддерживал новый набор из 57 команд MMX. Pentium MMX изготавливается по 0,28-микронной технологии, имеет внутренний L1-кэш объемом 32 Кбайт, тактовую частоту ядра 166-233 МГц, частоту шины 66 Мгц и разъем Socket 7.
Вслед за этим процессором корпорация Intel выпустила Pentium Pro — первую модель из семейства P6, в которой был впервые использован L2-кэш, выполненный на одном кристалле с ядром и работающий на частоте ядра процессора. Pentium Pro выпускается по 0,60- и 0,35-микронной технологии, имеет L1-кэш объемом 16 Кбайт, L2-кэш объемом 256, 512 или 1024 Кбайт, тактовую частоту ядра в 150-200 МГц, частоту системной шины в 66 МГц, разъем Socket 8.
Линейка процессоров Pentium II
Процессоры линейки Pentium II позиционируются Intel как CPU для массового PC средней производительности. В нее входят семейства процессоров Klamath, Deschutes и планируемые к выпуску в будущем семейства процессоров Katmai (Pentium III) и Coppermine. Здесь необходимо заметить, что имена Klamath, Deschutes, Katmai и Coppermine — это все рабочие названия процессоров, которые используются на этапе их разработки и после выпуска процессоров на рынок заменяются на официальные. Так, в официальной технической документации Intel вы на встретите названия Klamath или Deschutes — вместо этого используются, например, Pentium II 233 MHz или Pentium II 400 MHz. Кстати, совсем недавно Intel объявил о смене рабочего названия Katmai на официальное Pentium III.
Май 1997 был ознаменован появлением Klamath (ныне не выпускается) — первого процессора линейки Pentium II и первой модели с разъемом Slot 1. Klamath изготавливался по старой 0,35-микронной технологии — поэтому он работал только на частотах 233-300 Мгц и, вдобавок к этому, сильно нагревался (по сравнению с тем же Deschutes). Не прошло и года, как его сняли с производства.
Процессор Klamath имеет L1-кэш объемом 32 Кбайт (16 Кбайт для данных + 16 Кбайт для инструкций), L2-кэш объемом 512 Кбайт работает на половинной частоте процессора, частота системной шины 66 МГц, поддерживает MMX, многопроцессорность — до 2 процессоров. Напряжение на ядре — 2,8 В, на L2-кэше — 3,3 В. CPUID для процессоров семейства Klamath равен 63x.
Конструктивно процессор и L2-кэш размещаются на одной печатной плате (substrate). Сам процессор выполнен в виде одной микросхемы с пластиковым корпусом, которая имеет форму квадрата с отсеченными углами и распаивается в центре «лицевой» стороны платы. L2-кэш состоит из пяти микросхем: микросхемы TagRAM-памяти — расположена в центре «обратной» стороны платы («под» процессором), и четырех микросхем BSRAM-памяти — две расположены на «лицевой» стороне платы, симметрично по бокам от процессора, а оставшиеся две — на «обратной» стороне платы, симметрично по бокам от микросхемы TagRAM-памяти. На одном из краев платы расположены два ряда контактных выводов — по одному с каждой стороны платы. Эти краем плата устанавливается в разъем Slot 1 на материнской плате.
Печатная плата с процессором и L2-кэшем размещается внутри защитного S.E.C.C. (Single Edge Contact Cartridge) картриджа. Корпус картриджа состоит из теплоотводной металлической пластины (thermal plate), к которой может быть прикреплен пассивный или активный охлаждающий радиатор, и пластмассовой крышки (cover). Под теплоотводной пластиной расположена небольшая пластмассовая пластинка (skirt). Плата устанавливается внутрь картриджа таким образом, что ее «лицевая» сторона обращена к теплоотводной пластине. Охлаждение микросхемы процессора обеспечивается за счет ее непосредственного контакта с теплоотводной пластиной, чего не скажешь о микросхемах BSRAM-памяти L2-кэша — они, что называется, «варятся в собственном соку», поскольку конструктив S.E.C.C. картриджа не предусматривает для них никакого принудительного охлаждения.
Появление Deschutes в январе 1998 стало дальнейшим этапом в развитии линейки Pentium II. Процессор изготавливается по 0,25-микронной технологии, имеет тактовую частоту 266-450 МГц, частоту системной шины 66/100 МГц, L1-кэш объемом 32 Кбайт (16 Кбайт для данных + 16 Кбайт для инструкций), L2-кэш объемом 512 Кбайт — размещен на одной печатной плате с процессором и работает на половиннной частоте ядра, разъем Slot 1, поддерживает MMX, многопроцессорность — до 2 процессоров, имеет CPUID равный 65x. Будет производится до II квартала 1999 г.
Использование 0,25-микронной технологии (против 0,35-микронной для Klamath) позволило снизить не только себестоимость процессора (так как из одной кремниевой пластинки можно вырезать большее количество микросхем), но и напряжение на ядре — 2,0 В, что, в свою очередь, привело к снижению тепловой мощности, рассеиваемой процессором. Действительно, если 300 МГц Klamath рассеивает 43 Вт, то 333 МГц Deschutes — всего 20,6 Вт. Архитектура ядра процессора осталась такой же, как и у Klamath. Прежними же остались и возможности по поддержке многопроцессорности — до 2 процессоров.
Объем и частота (половина от частоты ядра) L2-кэша остались прежними, а вот его конструктив изменился. Если у Klamath он состоял из пяти микросхем (TagRAM + 4 BSRAM), то у Deschutes — из трех: TagRAM + две BSRAM. Это снижает себестоимость и энергопотребление, но сказывается на производительности: L2-кэш с четырьмя BSRAM-микросхемами при прочих равных условиях работает на 3%-5% быстрее, чем с двумя BSRAM-чипами.
Еще одно отличие Deschutes от Klamath — поддержка ECC-коррекции ошибок при обмене данными между ядром процессора и L2-кэшем. Если в семействе Klamath выпускались процессоры как с поддержкой ECC при работе с L2-кэшем, так и без нее, то для Deschutes ситуация несколько другая — все процессоры этого семейства поддерживают ECC-коррекцию ошибок при обмене данными между ядром процессора и L2-кэшем.
Конструктив всей процессорной сборки (картриджа, печатной платы, элементной базы) также претерпел некоторые изменения, причем среди процессоров Deschutes встречаются экземпляры, как минимум, в двух различных исполнениях — назовем их условно исполнением первого и второго типа. Вполне возможно, что существует не два, а большее количество исполнений процессоров Deschutes, однако конкретно нам приходилось работать лишь с двумя из них, а четкая официальная информация от производителя, которая могла бы внести ясность в этот вопрос, попросту отсутствует.
Итак, исполнение «первого типа». Характерно для ранних экземпляров процессора Deschutes и имеет следующие отличительные черты:
- процессор выполнен в виде микросхемы типа PLGA (Plastic Land Grid Array), которая имеет квадратную (а не усеченную по углам) форму и защитный металлизированный (а не пластиковый) корпус;
- в состав L2-кэша входят только две микросхемы BSRAM-памяти, которые расположены симметрично по бокам от процессора на «лицевой» стороне платы;
- используется картридж новой конструкции — «S.E.C.C. картридж с extended thermal plate (с увеличенной теплоотводной пластиной)», который обеспечивает лучшее охлаждение микросхемы процессора и L2-кэша (микросхем BSRAM-памяти).
Конструктив S.E.C.C. картриджа у Deschutes в исполнении «первого типа» претерпел некоторые изменения по сравнению с S.E.C.C. картриджем у Klamath, как и его название, которое изменилось на «S.E.C.C. картридж с extended thermal plate» вместо обычного «S.E.C.C. картридж». Если раньше заднюю стенку картриджа образовывали теплоотводная металлическая пластина (thermal plate) и небольшая пластмассовая пластинка (skirt), расположенная внизу, то теперь теплоотводная металлическая пластина имеет несколько большие размеры (extended thermal plate) и занимает всю заднюю стенку. Это позволяет улучшить охлаждение процессора. На теплоотводной пластине также появились два специальных выступа; когда картридж и печатная плата собраны в единую сборку, эти выступы соприкасаются с микросхемами BSRAM-памяти, обеспечивая тем самым охлаждение L2-кэша — напомним, что в S.E.C.C. картридже охлаждение микросхем памяти L2-кэша не предусмотрено.
Процессоры Deschutes в исполнение «второго типа» появились вместе с выпуском первых экземпляров Deschutes с тактовой частотой ядра 350-450 МГц. Они отличаются от Deschutes в исполнении «первого типа» тем, что:
- процессор выполнен в виде микросхемы типа OLGA (Organic Land Grid Array), которая имеет меньшие размеры (по сравнению с микросхемой процессора Deschutes в исполнение «первого типа») и совсем не имеет защитного корпуса (!);
- обе микросхемы BSRAM-памяти, входящие в состав L2-кэша, расположены с одной стороны от процессора (правой, если расположить печатную плату контактными выводами к себе, а «лицевой» стороной кверху), а не симметрично по бокам от процессора, как раньше;
- микросхема TagRAM-памяти расположена не по центру «обратной» стороны платы («под» процессором), а смещена влево (если расположить печатную плату контактными выводами к себе, а «обратной» стороной кверху);
- используется картридж с измененной конструкцией — «S.E.C.C.2 картридж», который обеспечивает лучшее охлаждение микросхемы процессора.
Самая интересная особенность этого исполнения — упаковка кристалла процессора, которая достаточно необычна. При производстве микросхемы такого типа — OLGA — готовый к упаковке кристалл опускается на заранее подготовленную подложку с контактами. После этого кристалл сильно прижимается к подложке и закрепляется в этом положении клеящим составом, который напоминает эпоксидную смолу. Таким образом, получается микросхема без защитного пластикового или металлизированного корпуса — верхняя плоскость кристалла остается открытой. Это позволяет улучшить отвод тепла от процессора, так как охлаждающий радиатор теперь может непосредственно соприкасаться с нагревающимся кристаллом, а не с защитным корпусом.
Еще одна особенность процессоров Deschutes в исполнения «второго типа» — использование нового типа картриджа — S.E.C.C.2. У этого картриджа вообще отсутствуют теплоотводная металлическая пластина и задняя стенка как таковая — доступ к печатной плате со стороны, на которой размещены микросхемы процессора и BSRAM-памяти, полностью открыт. Такое решение, во-первых, снижает стоимость картриджа и всей сборки в целом, и, во-вторых, улучшает охлаждение процессора, так как поверхность устанавливаемого охлаждающего радиатора соприкасается непосредственно с поверхностью кристалла (!) процессора.
Справочную информацию по процессорам Klamath/Deschutes вы можете найти в приложении 1.
Katmai (официальное название — Pentium III) — следующий за Deschutes процессор линейки Pentium II; его выпуск намечен на начало 1999 года. В нем впервые будет использован новый набор команд для обработки 3D графики — KNI (Katmai New Instructions). Существует также другое название KNI, используемое внутри Intel — SSE (Streaming SIMD Extensions). L1-кэш будет иметь размер 64 Кбайт (32 Кбайт для данных + 32 Кбайт для команд), L2-кэш объемом 512 Кбайт будет размещен на одной печатной плате с процессором и работать на половине частоты ядра процессора, разъем — Slot 1.
Katmai сначала будет изготавливаться по 0,25-микронной технологии и иметь тактовую частоту ядра 450/500 МГц при частоте системной шины 100 МГц. К концу 1999 г. планируется выпуск процессоров, изготовленных по 0,18-микронной технологии, с тактовой частотой ядра 533 МГц при частоте системной шины 133 МГц. Частота системной шины в 133 МГц будет поддерживаться в новом чипсете от Intel, который будет ориентирован на применение в системе оперативной памяти типа RAMBUS, поддержку AGP 4x mode и UDMA/66. В старших моделях Katmai объем L2-кэша будет достигать 1 Мбайт или даже 2 Мбайт. Katmai можно будет также использовать в уже имеющихся Slot-1 материнских платах на чипсете i440BX, но после перепрошивки BIOS.
Coppermine — следующий за Katmai процессор линейки Pentium III, который должен быть выпущен в III квартале 1999 года. Первые версии будут иметь частоту 600 МГц и L2-кэш емкостью 512 Кбайт, работающий на половинной частоте ядра процессора, поддерживать частоту системной шины в 133 МГц, набор инструкций KNI и MMX. Технологический процесс — 0,18 микрон, разъем — Slot 1. Ожидается версия для мобильных компьютеров.
Линейка процессоров Celeron
В линейку процессоров Celeron входят процессоры семейств Covington и Mendocino. Рассчитаны на применение в недорогих системах начального уровня.
Covington — первый процессор линейки Celeron, — появился на рынке в апреле 1998 года. Построен на ядре Deschutes и выпускается по 0,25-микронной технологии. Тактовая частота — 266-300 МГц, частота системной шины — 66 МГц, L1-кэш — 32 Кбайт (16 Кбайт для данных + 16 Кбайт для инструкций). Для уменьшения себестоимости выпускается без L2-кэша и защитного картриджа — в так называемом S.E.P.P. исполнении (Single-Edge Processor Package). Физический интерфейс — Slot 1.
Mendocino — следующий за Covington процессор линейки Celeron, выпущен в августе 1998 года. В отличие от своего предшественника, имеет L2-кэш объемом 128 Кбайт, интегрированный на одном кристалле с ядром и работающий на тактовой частоте ядра (!). Технология изготовления — 0,25 микрон. Тактовая частота — 300 (обозначается как «300A», чтобы легче было отличать ее от 300 МГц Covington'а) — 400 Мгц, частота системной шины — 66 Мгц, L1-кэш — 32 Кбайт (16 Кбайт для данных + 16 Кбайт для инструкций).
Mendocino может выпускаться как в виде платы под разъем Slot 1 (исполнение «Single-Edge Processor Package»), так и в виде одной микросхемы под новый разъем PGA370 — в PPGA-исполнении (Plastic Pin Grid Array Package). По своему дизайну 370-пиновый разъем PGA370 напоминает разъем Socket 7, а Mendocino в PPGA-исполнении — обычные процессоры Pentium. А вот дизайн печатной платы процессора Mendocino с разъемом Slot 1 идентичен дизайну платы процессора Covington — также с разъемом Slot 1, кроме одной детали: микросхема процессора Mendocino несколько больше микросхемы процессора Covington — видимо, за счет наличия дополнительного L2-кэша, выполненного на одном кристалле с процессором.
Справочную информацию по процессорам Celeron можно найти в приложении 2.
Линейка процессоров Xeon
Процессоры линейки Xeon позиционируются Intel как CPU для серверов и рабочих станций. В нее входит семейство процессоров Xeon и планируемые к выпуску в будущем семейства процессоров Tanner, Cascades, Willamete и Foster.
Процессор Xeon — это новая и пока единственная альтернатива процессору Pentium Pro, и кроме того, это первый процессор с разъемом Slot 2. L2-кэш Xeon'а работает на частоте ядра, как и у Pentium Pro, и может иметь объем 512, 1024, 2048 Кбайт, однако, в отличие от своего предшественника, выполнен не на одном кристалле с процессором, а в виде микросхем, расположенных на одной плате с ядром.
Xeon построен на ядре Deschutes, производится по 0,25-микронной технологии, поддерживает мультипроцессорные конфигурации (до четырех процессоров) и до 64 Гбайт физической оперативной памяти. Объем L1-кэша — 32 Кбайт (16 Кбайт для данных + 16 Кбайт для инструкций), тактовая частота ядра — 400-450 МГц, системной шины — 100 МГц. Поддерживает SMBus-интерфейс, что дает дополнительные возможности для управления системой. Выпускается в S.E.C.C.-исполнении.
Справочную информацию по процессорам Xeon можно найти в приложении 3.
Tanner — процессор, который должен придти на смену Xeon. Его выпуск запланирован на конец первого квартала 1999 года. Тактовая частота — от 500 МГц, шина — 100/133 МГц, CSRAM-кэш второго уровня, работающий на частоте процессора, объемом 512, 1024 и 2048 Кбайт, L1-кэш — 32 Кбайт, технология — 0,25 микрон, поддержка MMX и KNI, разъем — Slot 2.
Cascades — еще один процессор, который должен сменить Xeon. В отличие от Tanner, его цена планируется не такой высокой за счет меньшего объема L2-кэша — всего 256 Кбайт, который также будет работать на частоте процессора, но зато будет выполнен на одном кристалле с ядром. Разъем — Slot 2. Тактовая частота — от 600 МГц, системная шина — 133 МГц, L1-кэш — 32 Кбайт, технология — 0,18 микрон, поддержка KNI и MMX. Будет ориентирован на рынок PC средней мощности.
Foster — ожидается в конце 2000-го/-начале 2001-го года. Значительно больший, по сравнению с сегодняшним, объем кэш-памяти первого и второго уровней, сначала 0,18-, а потом 0,13-микронный технологический процесс и частоты от 1 ГГц и выше. Будет использовать шину от Merced и иметь разъем Slot M.
Микроархитектура процессоров семейства P6
Все процессоры линеек Pentium Pro, Pentium II, Celeron и Xeon имеют одинаковую базовую микроархитектуру и по этому признаку относятся к одному большому семейству процессоров P6. Для примера мы рассмотрим микроархитектуру процессоров линейки Pentium II.
Основная отличительная черта микроархитектуры процессоров семейства P6 — использование алгоритмики «динамического выполнения команд» (dynamic execution), которая построена на основе трех базовых концепций: предсказании переходов (branch prediction), динамическом анализе потока данных (dynamic data flow analysis) и спекулятивном выполнении инструкций (speculative execution).
Предсказание переходов — это концепция, которая реализована не только в микроархитектуре процессоров семейства P6, но и в микроархитектуре ряда других высокопроизводительных процессоров (например, процессоров мэйнфреймов). Суть ее заключается в следующем.
На вход процессора поступает поток инструкций для их последующего исполнения. Инструкции поступают в том порядке, в котором они содержатся в коде программы, исполняемой в данный момент процессором. Как только на входе процессора появляется очередная порция инструкций для исполнения, ее содержимое анализируется с целью найти точки ветвления в исполняемом потоке инструкций и предсказать наиболее вероятные пути (ветви), по которым пойдет обработка инструкций после этих точек ветвления. Инструкции, принадлежащие ветвям с наибольшей вероятностью выполнения, тут же ставятся в очередь на исполнение.
Основная идея всех этих манипуляций заключается в том, чтобы заставить процессор выполнить инструкции, которые принадлежат ветвям с наибольшей вероятностью выполнения, «вне очереди» — то есть не дожидаться того момента, когда очередь на выполнение дойдет до этих ветвей естественным образом (согласно порядку поступления инструкций на вход процессора и, соответственно, контексту выполняемой программы), а загрузить эти ветви на выполнение раньше этого момента. Таким образом обеспечивается более полная загрузка и, соответственно, более высокая производительность процессора.
Конечно, такое преждевременное исполнение инструкций может оправдать себя только в том случае, если алгоритм нахождения наиболее вероятных ветвей работает достаточно хорошо. Действительно, если ветвь угадана неверно, то процессору придется исполнить инструкции, принадлежащие как неверно угаданной, так и альтернативной ветви, проделав тем самым двойную работу. Если бы такая ситуация наблюдалась часто, то использование этой методики было бы невыгодно. Судя по тому, что концепция «предсказания переходов» активно используется производителями процессоров, соответствующая алгоритмика развита достаточно хорошо. В процессоре Pentium II за предсказание переходов «отвечает» Fetch/Decode Unit (модуль загрузки/декодирования инструкций).
Динамический анализ потока данных включает в себя выполняемый в режиме реального времени анализ зависимости инструкций от исходных данных и значений регистров процессора, а также определение возможности исполнения и непосредственное исполнение инструкций в порядке, отличном от порядка их первоначальной постановки в очередь на исполнение (out-of-order execution).
Dispatch/Execute Unit (модуль диспетчеризации/исполнения инструкций) процессора Pentium II может одновременно следить за ходом исполнения множества инструкций и выполнять их в таком порядке, который позволяет оптимизировать загрузку вычислительных ресурсов процессора. В это же самое время Dispatch/Execute Unit следит за целостностью данных, над которыми проводятся вычисления.
Выполнение инструкций в порядке, отличном от порядка их постановки в очередь на исполнение (out-of-order execution), позволяет избежать простоя вычислительных ресурсов даже в том случае, когда в L1-кэше нет данных, необходимых для исполнения инструкции, или между инструкциями есть зависимость данных, и зависимая инструкция не может быть исполнена (например, в результате исполнения инструкции «A» получаются данные, которые используются при исполнении инструкции «B»; соответственно, инструкция «B» не может быть исполнена раньше, чем инструкция «A»).
Спекулятивное выполнение инструкций — это способность процессора исполнить инструкции в порядке, отличном (как правило, с опережением) от порядка во входном потоке инструкций (что определяется кодом исполняемой программы), но завершить и возвратить (commit) результаты исполнения инструкций в порядке, соответствующем оригинальному входному потоку инструкций.
В процессоре Pentium II спекулятивное выполнение инструкций возможно благодаря тому, что этап «диспетчеризации и выполнения инструкций» (dispatching and executing of instructions) отделен от этапа «завершения и возвращения результатов» (commitment of results).
Используя динамический анализ потока данных, Dispatch/Execute Unit процессора исполняет все инструкции, находящиеся в пуле инструкций (instruction pool) и готовые к исполнению, после чего записывает результаты их исполнения во временные регистры.
В это время Retire Unit (модуль завершения и удаления инструкций) последовательно просматривает пул инструкций и ищет исполненные инструкции, которые не имеют зависящих от них других инструкций, и следовательно, могут считаться исполненными и готовыми к извлечению из пула инструкций. Найденные инструкции извлекаются из пула инструкций в том порядке, в каком они поступили в очередь на исполнение, результаты их исполнения возвращаются (commited) — записываются в оперативную память и/или в IA-регистры (Intel Architecture registers — регистры общего назначения процессора) и регистры данных математического сопроцессора (FPU — floating-point unit)), после чего инструкции удаляются из пула инструкций.
Алгоритмика динамического выполнения команд, включающая предсказание переходов, динамический анализ потока данных и спекулятивное выполнение инструкций, снимает ограничения традиционного «линейного» подхода, при котором весь цикл исполнения состоял из двух этапов — загрузки и выполнения инструкций, а сами инструкции обрабатывались в том порядке, в котором они поступали в очередь на исполнение.
Процессор Pentium II построен на основе семи базовых модулей — Fetch/Decode Unit (модуль загрузки/декодирования инструкций), Dispatch/Execute Unit (модуль диспетчеризации/исполнения инструкций), Retire Unit (модуль завершения и удаления инструкций), Instruction Pool (пул инструкций, его также называют Reorder Buffer — буфер переупорядочивания инструкций), Bus Interface Unit (модуль внешнего интерфейса), L1 ICache (L1-кэш для инструкций) и L1 DCache (L1-кэш для данных).
Fetch/Decode Unit предназначен для приема входного потока инструкций исполняемой программы, поступающего из L1-кэша инструкций, и их последующего декодирования в поток микроопераций (µops).
Этот модуль работает следующим образом. Прежде всего, блок Next_IP вычисляет индекс (порядковый номер) инструкции, содержащейся в L1-кэше инструкций, которая должна быть обработана следующей — то есть извлечена из L1-кэша инструкций и передана для последующего декодирования.
Индекс этой инструкции вычисляется блоком Next_IP на основе поступающей в него информации о прерываниях, которые были переданы в процессор для обработки, возможных предсказанных переходах (предсказание выполняется блоком Branch Target Buffer), и сообщениях о неправильно предсказанных переходах (branch-misprediction), которые поступают от целочисленных вычислительных ресурсов, расположенных в модуле Dispatch/Execute Unit. После вычисления индекса следующей обрабатываемой инструкции L1-кэш инструкций извлекает две строки кэшированных данных (cache line) — ту, которая соответствует вычисленному индексу, и следующую за ней, — а затем передает для декодирования извлеченные 16 байт, которые содержат IA-инструкции (Intel Architecture). Начало и конец IA-инструкций маркируются.
Далее маркированный поток байт обрабатывается сразу тремя параллельно работающими декодерами, которые отыскивают в нем IA-инструкции. Каждый декодер преобразует найденную IA-инструкцию в набор триадных микроопераций (µops) — триадных в том смысле, что микрооперация проводится над двумя исходными логическими операндами, а в результате ее выполнения получается только один логический результат. Микрооперация — это примитивная инструкция, которая может быть выполнена одним из вычислительных ресурсов, расположенных в модуле Dispatch/Execute Unit.
Из трех декодеров два — простые, которые могут преобразовывать только IA-инструкций, требующие выполнения одной микрооперации, а третий декодер — более совершенный; он может преобразовывать IA-инструкции, требующие выполнения от одной до четырех микроопераций. Таким образом, за один такт работы процессора все три декодера могут в сумме сгенерировать максимум шесть микроопераций. Для преобразования еще более сложных IA-инструкций используется микрокод, который содержится в блоке Microcode Instruction Sequencer и представляет собой набор предварительно запрограммированных последовательностей обычных микроопераций.
Полученные таким образом микрооперации передаются в блок Register Alias Table Allocate, где все содержащиеся в микрооперациях адреса IA-регистров преобразуются в адреса внутренних физических регистров процессора семейства P6 — тем самым IA-архитектура и P6-архитекура оказываются развязанными. Это существенно увеличивает возможности работы процессора при вычислениях, так как, во-первых, отпадает необходимость следить за целостностью содержимого IA-регистров при исполнении инструкций, во-вторых, адресное пространство перестает быть ограниченным возможностями IA-архитектуры и может быть значительно расширено, что приводит к росту скорости вычислений, и, в-третьих, такая переадресация обеспечивает возможность спекулятивного исполнения инструкций — далее все вычисления ведутся во внутренней P6-архитектуре процессора, а IA-архитектура снова появляется «на сцене» только на этапе завершения инструкций в модуле Retire Unit.
На этом же этапе к каждой микрооперации как информационной единице добавляются флаги состояния, в которые записывается информация об ее статусе. После этого микрооперации передаются в пул инструкций.
Instruction Pool (Reorder Buffer). Основное назначение этого модуля — предоставить возможность исполнения микроопераций в произвольном порядке; в том числе, отличном от порядка их генерации.
В тот момент, когда микрооперации попадают в пул инструкций, порядок их следования в потоке соответствует тому порядку, в котором они были сгенерированы в результате декодирования IA-инструкций, поступивших на вход модуля Fetch/Decode Unit, — никакого изменения порядка следования пока не произошло. Пул инструкций представляет собой последовательный массив инструкций; при этом любая из этих инструкций может быть в любой момент времени обработана модулем Dispatch/Execute Unit или Retire Unit — то есть порядок обработки инструкций может быть произвольным и не зависит от первоначального порядка, в котором инструкции поступили в пул. Именно поэтому пул инструкций иногда называют еще буфером переупорядочивания инструкций (Reorder Buffer).
Dispatch/Execute Unit. Этот модуль проверяет состояние микроопераций, содержащихся в пуле инструкций, исполняет их, если есть такая возможность, и записывает полученные результаты обратно в пул инструкций.
Reservation Station — основной управляющий блок модуля Dispatch/Execute Unit. Именно он планирует порядок исполнения и занимается диспетчеризацией (распределением между вычислительными ресурсами) микроопераций. Этот блок последовательно просматривает пул инструкций в поисках микроопераций, которые готовы к исполнению — таковыми считаются микрооперации, у которых готовы (т.е. вычислены/загружены) исходные операнды, — и передает (распределяет, диспетчеризует) их на исполнение свободным вычислительными ресурсам, которые могут исполнить микрооперацию. Результаты исполнения микрооперации записываются в пул инструкций и хранятся там вместе с самой микрооперацией до тех пор, пока последняя не будет завершена — этим занимается уже модуль Retire Unit.
Следует подчеркнуть, что жесткого, заранее предопределенного порядка исполнения микроопераций не существует — они исполняются сразу же, как только бывают готовы их операнды и свободен соответствующий вычислительный ресурс. В том случае, если одному и тому же ресурсу может быть одновременно передано на исполнение более одной микрооперации, последние исполняются по принципу псевдо-FIFO (First In First Out) — первой исполняется та микрооперация, которая раньше попала в пул инструкций.
Reservation Station имеет пять портов, через которые организуется обмен данными с пятью вычислительными ресурсами. Поэтому Dispatch/Execute Unit может за один такт исполнить максимум пять микроопераций. Однако при реальной работе с постоянной равномерной нагрузкой на процессор наиболее типична ситуация, когда за один такт исполняется три микрооперации.
Retire Unit — модуль, который знает как и когда завершить (commit) временные внутренние спекулятивные вычисления, выполненные в P6-архитектуре, преобразовать их и вернуть окончательный результат в IA-архитектуре.
Retire Unit постоянно сканирует содержимое пула инструкций и проверяет статус хранящихся в нем микроопераций. Как только находится исполненная и готовая к удалению из пула микрооперация, Retire Unit преобразует результаты ее исполнения, хранящиеся во внутреннем представлении процессора (то есть во внутренних регистрах, в контексте P6-архитектуры), к представлению в IA-архитектуре и записывает результат исполнения в опертивную память и/или в IA-регистры. После этого микрооперация удаляется из пула инструкций.
Тонкость этой процедуры заключается в том, что результаты исполнения микроопераций должны быть возвращены в контексте IA-архитектуры в том же порядке, в каком эти микрооперации были сгенерированы в модуле Fetch/Decode Unit при декодировании входного потока инструкций исполняемой программы.
Ситуация усложняется еще тем, что все это происходит на фоне непрекращающегося потока всевозможных прерываний, точек останова, ошибок предсказания переходов, а также внештатных ситуаций в работе процессора, которые нужно успевать обрабатывать.
Retire Unit процессора Pentium II способен завершить и удалить до трех микроопераций за один такт работы процессора.
Bus Interface Unit. Этот модуль отвечает за обмен данными между L1-кэшом инструкций, L1-кэшом данных, системной шиной и L2-кэшом.