Двухъядерные процессоры Intel и AMD: теория, часть 1
Итак, недавно два микропроцессорных гиганта – Intel и AMD – дружно выпустили свои первые двухъядерные процессоры, которые уже успели наделать много шума. Эти продукты стали не просто очередными конкурирующими новинками от лидеров отрасли персональных компьютеров (как это часто бывало в последние годы), но возвестили своим появлением о начале (не побоимся громких слов) целой эры (в тактическом и даже стратегическом понимании) «настольных» вычислений, очередного витка проникновения профессиональных технологий в потребительский сегмент. Новые микропроцессоры получились не просто интересными, но представляют собой весьма многогранные продукты, тщательное исследование которых не может ограничиться одним-двумя обзорами, написанными по горячим следам (каковыми можно признать большинство статей с тестами, спешно выполненными за несколько дней после получения сэмплов). Мы постараемся рассказать об этих новых продуктах более подробно и, по возможности, с разных сторон, не ограничивая себя жесткими временными рамками. Впрочем, мы также приглашаем к обсуждению этих продуктов и наших читателей – нa нашем Форуме и в виде авторских заметок, которые, при удачном сочетании таланта и смекалки их написавших, могут быть опубликованы на нашем ресурсе. :)
Но начнем мы, как и подобает, с теории. Благо, здесь явно есть, что обсудить.
Классификация: SMP, NUMA, кластеры…
Очевидно, что «ноги» у новых процессоров растут из многопроцессорных систем. А вариантов создания многопроцессорных систем – неисчислимое множество: даже простое перечисление всего созданного за прошедшие годы заняло бы слишком много места. Однако существует их общепринятая классификация:
1. SMP-системы (Symmetrical Multi Processor systems). В подобной системе все процессоры имеют совершенно равноправный доступ к общей оперативной памяти (см. рисунок). Работать с такими системами программистам – сущее удовольствие (если, конечно, создание многопоточного кода можно назвать «удовольствием»), поскольку не возникает никаких специфичных «особенностей», связанных с архитектурой компьютера. Но, к сожалению, создавать подобные системы крайне трудно: 2-4 процессора – практический предел для стоящих разумные деньги SMP-систем. Конечно, за пару сотен тысяч долларов можно купить системы и с большим числом процессоров… но при цене в несколько миллионов (!) долларов за SMP с 32-мя CPU становится экономически более целесообразно использовать менее дорогостоящие архитектуры.
2. NUMA-системы (Non-Uniform Memory Access systems). Память становится «неоднородной»: один её кусок «быстрее», другой – «медленнее», а отклика от во-о-он того «дальнего» участка вообще можно ждать «пару лет». В системе при этом образуются своеобразные «островки» со своей, быстрой «локальной» оперативной памятью, соединенные относительно медленными линиями связи. Обращения к «своей» памяти происходят быстро, к «чужой» - медленнее, причем чем «дальше» чужая память расположена, тем медленнее получается доступ к ней (см. рис.). Создавать NUMA-системы куда проще, чем SMP, а вот программы писать сложнее – без учета неоднородности памяти эффективную программу для NUMA уже не напишешь.
3. Наконец, последний тип многопроцессорных систем – кластеры. Просто берем некоторое количество «почти самостоятельных» компьютеров (узлы кластера или «ноды») и объединяем их быстродействующими линиями связи. «Общей памяти» здесь может и не быть вообще, но, в принципе, и здесь её несложно реализовать, создав «очень неоднородную» NUMA-систему. Но на практике обычно удобнее работать с кластером в «явном» виде, явно описывая в программе все пересылки данных между его узлами. То есть если для NUMA еще можно создавать программы, почти не задумываясь над тем «как эта штука работает» и откуда берутся необходимые для работы потоков данные; то при работе с кластером требуется очень четко расписывать кто, что и где делает. Это очень неудобно для программистов, и, вдобавок, накладывает существенные ограничения на применимость кластерных систем. Но зато кластер – это очень дешево.
Intel сегодня предпочитает создавать SMP-системы; AMD, IBM и Sun - те или иные варианты NUMA. Основная «область применения» кластеров – суперкомпьютеры.
Многоядерные процессоры
Основные вехи в истории создания двухъядерных процессоров таковы:
1999 год – анонс первого двухъядерного процессора в мире (IBM Power4 для серверов)
2001 год – начало продаж двухъядерного IBM Power4
2002 год – почти одновременно AMD и Intel объявляют о перспективах создания своих двухъядерных процессоров
2002 год – выход процессоров Intel Xeon и Intel Pentium 4 с технологией Hyper-Threading, обеспечивающей виртуальную двухпроцессорность на одном кристалле
2004 год – свой двухъядерный процессор выпустила Sun (UltraSPARC IV)
2004 год – IBM выпустила второе поколение своих двухъядерных процессоров (IBM Power5). Каждое процессорное ядро Power5 поддерживает аналог технологии Hyper-Threading
2005 год, 18 марта – Intel выпустила первый в мире двухъядерный процессор архитектуры x86
2005 год, 21 марта – AMD анонсировала полную линейку серверных двухъядерных процессоров Opteron, анонсировала десктопные двухъядерные процессоры Athlon 64 X2 и начала поставки двухъядерных Opteron 8xx
2005 год, 20-25 мая – AMD начинает поставки двухядерных Opteron 2xx
2005 год, 26 мая – Intel выпускает двухъядерные Pentium D для массовых ПК
2005 год, 31 мая – AMD начинает поставки Athlon 64 X2
Идея многоядерного процессора выглядит на первый взгляд совершенно тривиальной: просто упаковываем два-три (ну или сколько там влезет) процессора в один корпус - и компьютер получает возможность исполнять несколько программных потоков одновременно. Вроде бы бесхитростная стратегия… но конкретные её реализации в недавно вышедших настольных процессорах AMD и Intel заметно различаются. Различаются настолько, что сугубо «количественные» мелочи в конечном итоге переходят в качественные различия между процессорами этих двух компаний. Поэтому перед тем как переходить собственно к тестам современных двухъядерников, попробуем разобраться в различиях подходов этих микропроцессорных гигантов и, так сказать, «авансом» высказать некоторые предположения об их производительности.
Intel Smithfield: «классика жанра»
При создании многоядерных процессоров для настольных ПК микропроцессорный гигант предпочел пойти на первых порах по пути «наименьшего сопротивления», продолжив традиции создания привычных для себя SMP-систем с общей шиной. Выглядит подобная MP-система чрезвычайно просто: один чипсет, к которому подключается вся оперативная память, и одна процессорная шина, к которой подключены все процессоры:
В случае новеньких двухъядерных процессоров Smithfield два обычных ядра, аналогичных Prescott, просто расположены рядом на одном кристалле кремния и электрически подключены к одной (общей) системной шине. Никакой общей схемотехники у этих ядер нет.
У каждого «ядра» Smithfield – свой APIC, вычислительное ядро, кэш-память второго уровня и (что особенно важно) – свой интерфейс процессорной шины (Bus I/F). Последнее обстоятельство означает, что двухъядерный процессор Intel с точки зрения любой внешней логики будет выглядеть в точности как два обыкновенных процессора (типа Intel Xeon).
Сегодняшнее ядро Smithfield является «монолитным» (два ядра образуют единый кристалл процессора), однако следующее поколение настольных процессоров Intel (Presler, изготавливаемый по 65-нм технологии) будет еще тривиальнее – два одинаковых кристалла одноядерных процессоров (Cedar Mill) просто будут упакованы в одном корпусе (см. рис.).
Точно таким же будет и первый серверный процессор Intel данной микроархитектуры, известный сейчас под именем Dempsey. Но если у Smithfield на каждое из ядер приходится по 1 Мбайт кэш-памяти второго уровня, то у Presler и Dempsey это будет уже по 2 Мбайт на ядро.
Между тем, позднее у Intel пойдут другие, более сложные в плане микроархитектуры варианты двухъядерных процессоров, среди которых стоит отметить Montecito (двухъядерный Itanium), Yonah (двухъядерный аналог Pentium M) и Paxville для многопроцессорных серверов на базе Intel Xeon MP. Еще в марте этого года Патрик Гелсингер объявил, что в разработке у Intel находятся аж 15 различных многоядерных CPU, и пять из них корпорация даже демонстрировала в работе.
Причем, если еще в середине 2004 года официальные лица Intel отмечали, что многоядерные процессоры – это не «очередная гонка за производительностью», поскольку программная инфраструктура была тогда еще не очень готова поддержать такие процессоры оптимизированными приложениями, то теперь многоядерность у Intel поставлена во главу угла во всех базовых направлениях деятельности, в том числе – в разработке и отладке приложений (ну разве что кроме коммуникаций и сенсорных сетей – пока ;)). И в этом нет ничего удивительного – тактовую частоту процессоров стало наращивать все труднее и труднее, и, стало быть, надо искать что-то на cмену «гонки за мегагерцами». А добавляя ядра, производительность в ряде современных приложений уже можно заметно поднять, не повышая частоты. Да и пресловутый закон Мура (удвоение числа транзисторов на кристаллах) надо бы чем-то поддержать, а многоядерность – чуть ли не самый простой путь для этого… :)
Собственно, мультиядерность в текущем понимании Intel – это один из трех возможных вариантов:
-
Независимые процессорные ядра, каждое со своей кэш-памятью, расположены на одном кристалле и просто используют общую системную шину. Это - 90-нанометровый Pentium D на ядре Smithfield.
-
Похожий вариант – когда несколько одинаковых ядер расположены на разных кристаллах, но объединены вместе с одном корпусе процессора (многочиповый процессор). Таким будет 65-нанометровое поколение процессоров семейств Pentium и Xeon на ядрах Presler и Dempsey.
-
Наконец, ядра могут быть тесно переплетены между собой на одном кристалле и использовать некоторые общие ресурсы кристалла (скажем, шину и кэш-память). Таким является ближайший Itanium на ядре Montecito. А также мобильный Yonah, выход которого обещает наделать очень много шума.
Попутно отметим, что Montecito, изготавливаемый по 90-нм техпроцессу, будет иметь по сравнению с предшественником на 130-нм ядре Madison и ряд других преимуществ: наличие Hyper-Threading (то есть он будет виден в системе как 4 логических процессора), заметно меньшее энергопотребление, более высокую производительность (в 1,5 раза и выше), вчетверо больший размер кэш-памяти (свыше 24 Мбайт: 2x1 Мбайт L2 инструкций, 2x12 Мбайт L3 данных), 1,72 миллиарда транзисторов против 410 миллионов и другое. Выйдет этот процессор в четвертом квартале 2005 года.
Не менее интересным ожидается и первый двухъядерный мобильный процессор Yonah, который должен появиться в начале 2006 года в рамках новой мобильной платформы Napa. Yonah будет иметь два вычислительных ядра, использующих общую 2-мегабайтную кэш-память второго уровня и общий же контроллер системной шины QPB с частотой 667 МГц. Он будет выпускаться по 65-нм технологии в форм-факторах PGA 478 и BGA 479, содержать 151,6 млн. транзисторов, поддерживать технологию XD-bit и, судя по предварительной информации, поддерживать некоторые механизмы прямого взаимодействия ядер между собой.
Более того, Intel не исключают и того, что процессоры на «мобильном» ядре Yonah будут использоваться не только в определенных сегментах рынка настольных компьютеров (для этого уже разработаны и демонстрируются соответствующие мини-концепты домашнего и офисного ПК), но даже в компактных экономичных серверах.
Общие планы перехода Intel на двуядерную и многоядерную архитектуру процессоров показаны на рисунке. Первым восьмиядерным процессором Intel станет, по всей видимости, Tukwila в 2007 году, продолжающая линейку Intel Itanium.
Пока же мы имеем от Intel только Smithfield – простейшие «двухпроцессорные процессоры» - язык даже не поворачивается говорить о «ядрах». Всё скучно до невозможности (впрочем, далеко не всегда двигает прогресс то, что «весело» :))… И, к сожалению, несовместимо со всеми уже существующими чипсетами самой Intel, ибо чипсеты, рассчитанные на однопроцессорную шину, теперь вынуждены будут работать фактически с «дуальными» системами, а двухпроцессорным чипсетам (напомним, что Intel четко разделяет процессоры «для дуалов» и для «многопроцессорных систем») придется научиться работать с «квадами» - четверками процессоров. То есть нагрузка на системную шину существенно возрастет и прежние чипсеты на нее по-настоящему просто не рассчитаны. Кстати, в Intel пробовали запускать Smithfield на чипсетах серии i925/915, но работа такой связки не всегда была достаточно стабильной, поэтому от нее было решено официально отказаться и даже предусмотреть меры, исключающие запуск двухъядерных процессоров на платах со старыми чипсетами.
Аналогично двухъядерность «аукнулась» и в линейке Intel Xeon – отчасти именно из-за увеличения нагрузки на шину QPB, которую используют эти двухъядерные процессоры, Intel и задерживается с выпуском двухъядерных Xeon MP для четырех и более процессорных систем, предпочитая разработать для них новый 90-нм кристалл Paxville, который будет иметь общий на два процессорных ядра контроллер системной шины (чтобы снизить нагрузку на нее), хотя кэш-память по-прежнему будет своя у каждого из ядер. Двухпроцессорные же Xeon на первых порах останутся чисто «двухкристальными» Dempsey.
Впрочем, не подумайте, что мы осуждаем такой подход Intel: несмотря на все свои «подводные камни» он, в конечном счёте, позволит этой корпорации довольно быстро «завалить» прилавки дешевыми и доступными каждому двухъядерниками. Правда, по-настоящему массовыми двухъядерные процессоры станут лишь в следующем году: Intel планирует, что в 2006 году 85% серверных и более 70% клиентских компьютеров (ноутбуков и десктопов) будут иметь двухъядерные процессоры (а в 2007 году эти цифры возрастут до 100% и 90% соответственно), хотя на первых порах «двухъядерники» будут скорее процессорами «для энтузиастов» - недаром же для своей новейшей офисной платформы Lyndon (см. www.ferra.ru/online/system/25893) корпорация предпочитает использовать «старые добрые» одноядерные Pentium 4 шестисотой серии.
Наконец, отметим, что организация «системы в целом» у Intel столь же традиционна, сколь и устройство двухъядерного процессора. В ней есть несколько «равноправных» центральных процессоров (как правило, разделяющих общую шину); есть оперативная память и есть разной степени быстродействия периферия. Весь этот комплект объединяется в единое целое специальным коммуникационным процессором – «северным мостом» (Northbridge) чипсета. Через него проходят буквально все потоки данных, которые только зарождаются в компьютере. Образно говоря, если «процессоры» - это «головы» компьютера, то северный мост – это его сердце. Подобный «централизованный» подход, во-первых, отличается относительной простотой, а во-вторых, удобен тем, что в нём каждый компонент компьютера получается узкоспециализированным, и поддающимся модернизации независимо от других компонентов. То есть с одним и тем же Northbridge можно использовать, например, совершенно различные по своей производительности и наоборот – меняя Northbridge, можно, например, использовать с одним и тем же процессором совершенно разные типы оперативной памяти..
Немного о терминологии Внимательные читатели уже обратили внимание на «загадочные» блоки с подписями APIC, DMA, GART… что все они означают? • APIC (Advanced Programmable Interrupt Controller) – одна из важнейших «деталек» любого компьютера. Это небольшая схема, занимающаяся сбором и обработкой возникающих в компьютере прерываний. Скажем, нажал пользователь клавишу на клавиатуре – контроллер клавиатуры зафиксировал это событие, занес код нажатой клавиши в свою встроенную память – и сгенерировал прерывание – выдал по специальной линии сигнал-запрос с просьбой прервать выполнение текущей программы и обработать событие «нажата клавиша на клавиатуре». Это, так сказать, «классическая» задача Interrupt Controller-ов: они позволяют процессору не терять зря время, регулярно опрашивая каждое из устройств на предмет того, «а не случилось ли там чего-нибудь за последние 10 мс». Но задачи IC не ограничиваются только этим: помимо аппаратных существуют еще и программные прерывания (exceptions), которые генерирует не периферия, а сам процессор – в случае возникновения какой-либо нештатной ситуации. Типичные примеры – в программе встретилась непонятно какая, или просто запрещенная «простому пользователю» инструкция (#GP, General Protection Exception), произошло деление на ноль (#DE, Divide-by-Zero Error Exception), программа обратилась к несуществующему адресу в памяти (#PF, Page Fault Exception). Некоторые прерывания может генерировать сама программа (INTn), а, скажем, прерывание #BP (BreakPoint Exception) используется операционной системой для отладки программ. Реакция на каждое из прерываний задается так называемым вектором прерываний – набором адресов в памяти, описывающих «что делать дальше» процессору в случае возникновения прерывания: какие функции (обработчики прерывания) ему в этом случае необходимо выполнять. В общем, PIC-и были, есть и будут одной из ключевых компонент компьютера. Причем в случае многопроцессорных, многоядерных (и даже в случае процессоров с Hyper-Threading!) требуется обеспечить по APIC-у на каждое ядро процессора (включая каждое виртуальное ядро в Pentium 4 supporting Hyper-Threading), обрабатывающих «программные прерывания, и еще один, «синхронизирующий» APIC в чипсете, который обеспечивает обработку аппаратных прерываний и, занимается «рассылкой» программных прерываний в тех случаях, когда возникшее на одном процессоре прерывание почему-то затрагивает и остальные процессоры. • DMA (Direct Memory Access) – это такой своеобразный «альтернативный процессор», который занимается в чипсете обработкой «фоновых» задач, связанных с периферией. Скажем, если процессору требуется прочитать пару килобайт данных с жесткого диска, то ему вовсе не обязательно терпеливо ждать целую вечность (несколько миллисекунд), пока эти самые данные ему не будут предоставлены. Вместо этого он может запрограммировать DMA-контроллер, чтобы тот выполнил эту задачу за него, и переключиться, пока этот запрос выполняется, на какую-нибудь другую задачу. Штука это не столь незаменимая, как APIC, но без неё не было бы даже интерфейса Ultra ATA/33 • GART (Graphical Address Relocation Table) появился в компьютерах одновременно с шиной AGP: это небольшая схема, которая обеспечивает графическому ускорителю доступ к системной памяти процессора. Её задачи – реализация механизма виртуальной памяти для GPU, то есть отображение «линейного» адресного пространства, с которым работает ускоритель, на «реальное», произвольным образом «перетасованное» с «обычными данными». Позволяет современным 3D-ускорителям использовать не только «набортную» видеопамять, но и «основную» системную память компьютера. |
AMD Toledo: SUMA, SRI и интегрированный Northbridge
Архитектура AMD K8 не просто отличается от «интеловской»: она концептуально иная, поскольку в ней нет какого-то выделенного центра. Каждый из процессоров архитектуры AMD64 является независимой и «самодостаточной» единицей, объединяющей в себе почти всю функциональность северного моста традиционных наборов системной логики. Это началось с одноядерных процессоров, а с появлением двухъядерников «обросло» новыми отличиями. Взглянем на блок-схему двухпроцессорной системы на двухъядерных AMD Opteron.
Если смотреть на этот вопрос с чисто технической стороны, то AMD попросту интегрировала практически всю функциональность северного моста в центральный процессор. На блок-схемах в «даташитах» так и обозначается: вот собственно процессорное ядро, вот HT-интерфейс, а вот здесь у него Northbridge. Но «небольшая» технологическая уловка приводит к совсем иной архитектуре компьютера – SUMA, в отличие от традиционной SMP. Перечислим кратко основные преимущества SUMA над «классической» SMP.
• Основа SUMA – последовательная шина HyperTransport (подробнее об этой шине можно почитать, например, на http://offline.computerra.ru/2004/547/34188). В серверных вариантах процессоров AMD может быть интегрировано до трех независимых линков HT, работающих на частотах до 1 ГГц (2 ГГц с учетом режима передачи данных DDR) и шириной по 16 бит (4 Гбайт/с) в каждом из направлений. Часть HT-линков используется для соединений точка-точка между процессорами, часть задействуется для подключения периферийных устройств (через внешний чипсет, разумеется, поскольку HT связывает один из процессоров с чипсетом тоже как точка-точка). Для программиста HT полностью совместима с традиционной программной моделью PCI; при этом с «логической» точки зрения весь компьютер, напрямую подключаются к единой шине HT, объединяющей все устройства, от центрального процессора и до «распоследней» PCI-карточки, вставленной в обычный PCI-слот.
• В каждый процессор интегрируется контроллер «локальной» оперативной памяти (собственно, по сравнению с одноядерными процессорами AMD64 контроллер памяти почти не изменился). На сегодняшний момент в зависимости от процессора это может быть одно- или двухканальный (у двухъядерников – пока только двухканальный) контроллер памяти DDR 200/266/333/400 (небуферизованной или регистровой, с поддержкой ECC и без неё). Обращения к памяти «чужих» процессоров происходят по шине HyperTransport, причем делается эта «переадресация» запросов абсолютно прозрачно для собственно вычислительного ядра процессора – ее осуществляет встроенный в Northbridge коммутатор (CrossBar), работающий на полной частоте процессора. Этот же самый CrossBar обеспечивает «автоматическую» маршрутизацию проходящих через процессор сообщений от периферийных устройств и других процессоров, включая обслуживание «чужих» запросов к оперативной памяти.
• Шина HT специально оптимизировалась для подобного режима работы со множеством «служебных» сообщений (которые возникают при использовании MOESI, о котором мы расскажем чуть позже) и обеспечивает крайне низкую латентность обращения в «чужую» память и высокую (до 4 Гбайт/с) пропускную способность при обращении к памяти «соседей». Шина является полнодуплексной, т.е. шина позволяет одновременно передавать данные на этой скорости в «обе стороны» (до 8 Гбайт/с суммарно). Модель памяти получается неоднородной (NUMA), но различия в скорости «своих» и «чужих» участков оперативной памяти получаются относительно небольшими.
• Чипсет сильно упрощается: всё, что от него требуется – это просто обеспечивать «мосты» (туннели) между HT и другими типами шин. Ну и, возможно, заодно обеспечивать какое-то количество интегрированных контроллеров. Особенно ярко этот принцип проявляется в серверном чипсете AMD 81xx, поскольку это просто набор из двух чипов – «переходников» на шины AGP и PCI-X и чипа, интегрирующего туннель на «обычную» PCI и стандартный набор периферийных контроллеров (IDE, USB, LPC и проч.). Впрочем, традиционные «большие» чипсеты тоже никто использовать не запрещает: к примеру, NVIDIA успешно выпускает Force3 и nForce4, объединяющие все необходимые туннели и контроллеры в единственном кристалле. Но зато можно, к примеру, установить на плату чип nForce Professional 2200 (решение «всё-в-одном» от NVIDIA для рабочих станций) и добавить к нему «в напарники» AMD 8132, который обеспечит материнской плате поддержку шины PCI-X, которой в nForce Pro 2200 нет. Или использовать несколько чипов nForce Pro 2200, чтобы обеспечить, к примеру, вдвое большее число линий PCI Express. Здесь всё совместимо со всем: любые современные чипсеты для микроархитектуры AMD64, теоретически, должны работать и с любыми процессорами AMD… и любыми «правильно» сделанными «напарниками». И, в частности, все двухъядерные процессоры AMD должны работать со всеми ранее выпущенными чипсетами для процессоров архитектуры K8.
AMD сейчас любит подчеркивать, что её процессоры «специально проектировались в расчёте на двухядерность», но, строго говоря, правильнее было бы говорить, что двухядерность очень удачно ложится на её архитектуру. Каждый процессор K8 является «системой в миниатюре», со своим «процессором» и Northbridge; а двухядерный K8 – «двухпроцессорная SMP-система в миниатюре».
Второе ядро подключается к кросс-бару через общую шину SRI; оба ядра идентичны и, фактически, являются полноценными процессорами; общего кэша L2 нет. То есть если мы, скажем, рассматриваем однопроцессорную двухядерную систему, то вся разница между реализациями AMD и Intel с «технологической» точки зрения заключается в том, что у Intel Northbridge реализован отдельным кристаллом, а у AMD он просто интегрирован в центральный процессор. Но…
…Но интеграция Northbridge в процессор и SUMA-архитектура K8 не просто обеспечивает «более быстрый контроллер оперативной памяти», - она заодно позволяет очень эффективно решать и ряд свойственных многопроцессорным системам проблем.