Опубликовано 30 января 2004, 00:33

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

Этой публикацией мы начинаем цикл переводов замечательных статей, популярно рассказывающих о принципах работы современных микропроцессоров.

Этой публикацией мы начинаем цикл переводов замечательных статей, популярно рассказывающих о принципах работы современных микропроцессоров.

Современные процессоры вобрали в себя так много технологий, что за улучшениями и надстройками легко можно потерять из виду те принципы, которые сегодня лежат в основе современных компьютерных технологий. Будем начинать с основ, вернувшись во времена технического превосходства процессоров DEC Alpha и выхода на рынок AMD Athlon.

Все новое – хорошо развитое старое

Вы когда-нибудь задавались вопросом, почему процессоры Alpha способны достигать столь высоких скоростей? Почему ядро Intel P6 сможет достичь 800 МГц и более а ядро К6 скорее всего никогда? И почему AMD утверждает что ядро К7 рассчитано на высокие частоты?

Ну что же, пора выяснить, в чем дело. Эта статья представляет собой первую в серии статей, целью которой является разъяснить, что же делает процессор быстрым. Мы пристально взглянем под панцирь этим цифродробилкам. Поверьте, там есть на что посмотреть. И не беспокойтесь: цель этой статьи объяснить, а не забросать умными словами. Так что вперед!

Процессоры 5-7 поколения. Они уже такие разные...

Довольно занятно: в то время как процессоры Alpha "летали" на умопомрачительной тогда скорости в 700 МГц, AMD были все еще на 450 МГц, а Intel только-только добрался до 500 МГц. Это различие становится еще более заметным, если учесть тот факт что Alpha достигала 533-600 МГц еще на 0,35 мкм процессорах! AMD и Cyrix никогда не могли выжать из своих 0,35 процессоров больше чем 233 МГц. Так что больше не позволяйте кому-то говорить вам что все зависит от тех процесса!

Как получить высокие частоты

На вопрос, почему некоторые процессоров быстрее чем другие, обычно получаешь три ответа:

  1. Лучшие производственные возможности (передовые технологии, более тонкий тех процесс)
  2. Меньший размер процессора и более низкая теплоотдача.
  3. Более глубокие конвейеры

А теперь, давайте посмотрим на цифры:

ПроцессорГод запускаТехпроцесс,мкмРазмер кристалла,мм2Макс. частота, МГцSpec Int 95Spec FP 95
IntelP II970,3520330011,98,6
AMDK6970,351682337,13,9
SunUltrSparc lli980,3515636015,219,9
DECAlpha 21164950,52993339,813,4
DECAlpha 21164a970,3520960018,421,4
DECAlpha 21264980,253026674060
HPPA-RISC 8200970,534522015,525

Хотя DEC обычно сама производила свои процессоры Alpha, последнее время (до продажи процессорного бизнеса легендарной компании корейскому Samsung’у) кристаллы для DEC производились на фабриках Intel, производственный процесс которых был лучше. Процессоры на 0,25 мкм тех процессе появились у Intel заметно раньше, чем у DEC. Опять же, как мы уже отмечали, Alpha работали намного быстрее.

Малый размер кристалла? Но кристаллы процессоров Alpha и HP просто огромны! И это не мешает им обходить намного более меньшие по размерам процессоры от Intel и AMD (используя такой же тех процесс, конечно).

Winchip IDT был очень мал, и процессоры AMD всегда были меньше их аналогов от Intel. Но совсем не помогло им в противоборстве с Intel. Выходит, что не все зависит от производственного процесса.

Глубокий конвейер? Это ни о чем не говорящий ответ. Как может глубокий конвейер помочь достичь высоких мегагерц? И вообще, что из себя представляет глубокий конвейер?

Ваш первый микропроцессор

Чтобы ответить на наши вопросы нам придется собрать свой собственный маленький процессор. Первое что вам следует узнать, это то, что главные события в процессоре разворачиваются в так называемом "Арифметико-Логическом Устройстве" или просто АЛУ. Это именно тот отдел процессора где происходит непосредственно обработка данных. Данные же, АЛУ получает из регистров.

Оно считывает данные из регистров, производит определенные вычисления (например, сложение, вычитание, увеличение на единицу, логическое "или", и т.д.), а затем заносит результаты вычислений обратно в регистры. Впоследствии эти данные (посредством кэша) возвращаются в основную память.

Таким образом, можно сделать вывод, что регистры должны быть очень быстрыми, иначе АЛУ будет простаивать во время записи и считывания данных.

Итак, в течении всего одного такта мы и считываем данные с регистра, и записываем их в него! Другими словами, если у вас, положим, в регистре Z хранится число X, а АЛУ, по инструкции, следует, скажем, прибавить к нему единицу, то возможно записать число ответ в тот регистр. Хм, и неужели это пройдет без проблем? Вообще-то говоря, не совсем. Давайте, тогда, разбираться что же делает процессор в течении такта.

high.jpg

high.jpg

Как известно, все современные микропроцессоры являются синхронными. Иными словами там есть счетчик, который регулярно посылает сигналы, представляющие собой, в идеале, чередование прямоугольных импульсов. При "падении" импульса мы выставляем затворы регистров (черные и синие стрелки), делается это для того, чтобы данные, поступающие из L1 кэша (синие стрелки указывающие на регистры) записались в верный регистр. Помимо этого, если, вы обратили внимание, на рисунке изображены четыре горизонтальных стрелки слева от АЛУ. Это – шина команд. По ней передаются инструкции для АЛУ. (На нашем процессоре мы можем сделать до 2^4=16 различных команд). На все это уходит очень малое время Dsignal. Оно занимает лишь небольшую часть такта.

Затем надлежащие данные следует отправить по шине (красно-желтая стрелка) в АЛУ. На доставку также уходит некоторое время (DB), так как прежде чем АЛУ начнет производить вычисления, значения чисел в регистрах должны хорошо установиться.

Коль скоро все выполнено, АЛУ приступает к работе. После вычислений (DАЛУ) результаты передаются шине данных регистров (еще DR). При "подъеме" следующего импульса они загружаются в регистры.

Clock.gif

Clock.gif

В этом заключается основная концепция современных микропроцессоров: в каждом цикле есть сигнал, который переключает определенные триггеры. Например, в регистры можно загружать данные лишь в начале ("подъеме") импульса, а считывать только в конце (загрузка в это время блокируется). Именно поэтому АЛУ может в течении(?) одного цикла и считать, и записать данные в регистр.

Сказанное выше поможет ответить нам на наш изначальный вопрос: как получить высокую тактовую частоту. Ясно что, высокая частота значит малое время между последовательными импульсами. Ясно также (см. рис.), что это время не может быть меньше чем сумма времен DSig, DB, DALU, и DR (плюс еще немного, для подстраховки).  В противном случае, может оказаться так, что мы, например, начнем загружать новые данные, прежде чем результаты будут соответствующим образом занесены в регистры.

Итак, если мы способны уменьшить какой-нибудь из D, мы сможем увеличить частоту. Три возможных способа:

  1. Сделать так, чтобы данные шли через процессор быстрее.
  2. Сократить время вычислений.
  3. Делать как можно меньше операций в течении одного цикла.

…чтобы шли быстрее

Заставить поток битов ходить в процессоре быстрее непросто. Во-первых, нужно, насколько это возможно, уменьшить число препятствий на пути электронов. Это зависит от технологии производства, и температуры кристалла. Чем лучше технология, тем лучше конечный продукт.

А температура? Она то тут причем? А притом, что атомы в кристаллической решетке находятся в тепловом движении, и амплитуда его пропорциональна температуре. А чем больше амплитуда, тем меньше шансов у электрона проскочить мимо атома. Таким образом, чем ниже температура, тем более беспрепятственно движутся электроны. Именно поэтому охлажденные процессоры работают быстрее.

Еще один способ уменьшить время прохождения битов заключается в сокращении проходимого ими пути. Для этого следует уменьшить размеры транзисторов, а как следствие, расстояние между ними. Такой подход позволил Intel и AMD достичь 600 МГц; они собирались изготовить 0,18 микронные процессоры взамен более «громоздких» 0,25-х.

…сократить время вычислений

Машины хорошо умеют делать параллельно несколько вещей. Поэтому какой-нибудь навороченный блок для сложения сможет складывать быстрее, чем более простая конструкция, сокращая, таким образом, DALU. Впрочем, здесь не все так просто: сложное устройство, конечно, считает быстро, но зато оно и больше.

…делать поменьше операций

Улучшить технологию производства – легко сказать, да трудно сделать. Это стоит чертову уйму денег. Такое называют «методом грубой силы». Неужели нет более интеллектуального подхода? Ведь в конце концов, инженеры из Alpha просто смеются над 500 МГц на 0,25 мкм процессоре; они достигли 600 МГц на 0,35!

Давайте-ка, попробуем модернизировать наш процессор, иначе он сможет работать только на 10 МГц, и то, если повезет. (Найдете такой в местном магазине, не в коем случае не берите!).

Можно сократить объем работы производимой в течении одного цикла. Вместо 7 операций за один цикл, будем делать один. Тогда, очевидно, можно будет сократить и продолжительность цикла.

Звучит очень странно. Ведь в таком случае, та же процедура займет в 7 раз дольше времени! Ну, разве это не полная чепуха? А вот и нет, вот тут то мы и сталкиваемся с конвейерами.

Использование конвейера позволяет всем устройствам процессора выполнять свою работу одновременно. Пусть, например, в нашем процессоре есть 4 устройства:
Fetcher – ищет  следующую инструкцию.
Декодер – выясняет смысл инструкции.
АЛУ – выполняет инструкции.
Retire блок – возвращает результаты в память.

Итак, если в нашей схеме используются конвейеры, процесс будет выглядеть так: fetcher получает инструкцию 4, decoder декодирует инструкцию 3, АЛУ выполняет инструкцию 2, а результат инструкции 1 отправляется назад в память. И таким образом, в конце каждого такта мы имеем выполненную инструкцию.

ТактFetcherDecoderАЛУRetire
1инструкция 1
2инструкция 2инструкция 1
3инструкция 3инструкция 2инструкция 1
4инструкция 4инструкция 3инструкция 2инструкция 1
5инструкция 5инструкция 4инструкция 3инструкция 2
6инструкция 6инструкция 5инструкция 4инструкция 3
7инструкция 6инструкция 6инструкция 5инструкция 4
8инструкция 7инструкция 7инструкция 6инструкция 5
9инструкция 8инструкция 8инструкция 7инструкция 6

Суперконвейеризация, или разбиение конвейера на большое число стадий, позволяет делать за один цикл меньше, притом, что снаружи все выглядит так, что процессор делает все тот же объем работы за один цикл. Напомним, что это позволяет очень сильно увеличить частоту.

Так что же мешает увеличивать число стадий неограниченно?

Да, почему бы просто взять и сделать, скажем, 20 стадий (как в последствии поступит Intel с Pentium 4)? Сделать то можно, но дело в том, что это может вызвать некоторое подобие пробки в процессоре. Разберемся в этом поподробнее.

Представим себе, что инструкция 1 требует вычисления А=С*2, а инструкция 2 – В=А+1. Если на вычисление А уходит 20 тактов, то за выполнение инструкции 2 процессор возьмется лишь через 29 тактов! Ясно что, чем больше стадий у конвейера, тем большая «пробка» может образоваться.

К счастью, глубокая конвейеризация не единственный способ увеличить частоту. Можно делать побольше операций параллельно. Ведь именно число операций сделанных последовательно определяет минимальную продолжительность цикла.

Собираем вместе

Если вы помните, семейство К-6 обладало 6 уровневым конвейером. А у PII их было 12! И хотя у К6 был лучше и АЛУ (DАЛУ меньше), и декодеры (они делают многое параллельно), К6-3 было очень сложно достичь частоты PII при той же технологии производства. Предел для .35 микронного К6 равен 233 МГц, а для такого же PII 300 МГц. (тоже самое можно сказать и о противостоянии следующих поколений: Athlon и P4).

Ultrasparc II использует конвейер с 9 стадиями, но следует учесть тот факт что RISC процессоры не нуждаются в большом объеме декодировки. На один только фетчинг и декодировку у PII уходит 7 циклов, в то время как у UltraSPARC лишь 3. Так что, в некотором смысле, у UltraSPARC конвейеризация глубже.

Конвейер Alpha состоит из 7 стадий (10 у FPU), но и у него, по сравнению с PII, с декодировкой  проблем меньше. Вдобавок к этому, инженеры Alpha делают каждую стадию настолько простой, насколько это только возможно. Добиваются они этого, заставляя делать процессор по возможности больше операций параллельно. Продолжительность такта, таким образом, уменьшается до минимума. За что, в прочем, приходиться платить: процессоры Alpha просто огромны (302 мм2 у Alpha 21264).

Понимаете ли вы теперь почему латентность конвейеризованного FPU К7 (4 такта на сложение, 4 такта на умножение) возросла по сравнению с К6 (2 на сложение, 2 на умножение)? FPU К7 делает меньше чем работы за один такт чем К6, что позволяет ему достигать много больших частот. 10 уровневый конвейер для целочисленных операций (15 для FPU) позволило К7 достичь таких частот, о каких К6 мог только мечтать…Cyrix делало то же с Jalapeno (сейчас это VIA C3).

Конечно же, не следует забывать, что частота не единственное что делает процессор быстрым. О других же «трюках» мы расскажем в следующей статье.