Сейчас 2-х ядерным процессором уже никого не удивишь. Другое дело, что
е у каждого в компьютере стоит такой процессор. Кому-то не позволяют финансы, а кому-то устойчивые слухи, что многоядерные процессоры это очередная туфта, вроде SLI, предназначенная для вытягивания денежки из карманов пользователей.

 

В принципе так и есть – тактовую частоту процессоров стало наращивать все труднее и труднее,(растет число транзисторов, проводников и выделяемое тепло) и, стало быть, надо искать что-то на смену “гонки за мегагерцами”. А добавляя ядра, производительность в ряде современных приложений уже можно заметно поднять, не повышая частоты. Да и пресловутый закон Мура (удвоение числа транзисторов на кристаллах) надо бы чем-то поддержать, а многоядерность – чуть ли не самый простой путь для этого… 🙂

 


Однозначно одно, (хотя бы судя по опросу который я проводил) никто бы не отказался от C2D(особенно бесплатно).

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

Часть 1. Немного истории и терминов.

Очевидно, что “ноги” у многоядерных процессоров растут из многопроцессорных систем. А вариантов создания многопроцессорных систем – неисчислимое множество: даже простое перечисление всего созданного заняло бы слишком много места. Однако существует их общепринятая классификация по доступу к памяти:


1. SMP-системы (Symmetrical Multi Processor systems). В подобной системе все процессоры имеют совершенно равноправный доступ к общей оперативной памяти. Работать с такими системами программистам – сущее удовольствие (если, конечно, создание многопоточного кода можно назвать “удовольствием”), поскольку не возникает никаких специфичных “особенностей”, связанных с архитектурой компьютера. Но, к сожалению, создавать подобные системы крайне трудно: 2-4 процессора – практический предел для стоящих разумные деньги SMP-систем. Конечно, за пару сотен тысяч долларов можно купить системы и с большим числом процессоров… но при цене в несколько миллионов (!) долларов за SMP с 32-мя CPU становится экономически более целесообразно использовать менее дорогостоящие архитектуры.



2. NUMA-системы (Non-Uniform Memory Access systems). Здесь доступ к память становится “неоднородной”: один её кусок “быстрее”, другой – “медленнее”, а отклика от во-о-он того “дальнего” участка вообще можно ждать “пару лет”. В системе при этом образуются своеобразные “островки” со своей, быстрой “локальной” оперативной памятью, соединенные относительно медленными линиями связи. Обращения к “своей” памяти происходят быстро, к “чужой” – медленнее, причем чем “дальше” чужая память расположена, тем медленнее получается доступ к ней. Создавать NUMA-системы куда проще, чем SMP, а вот программы писать сложнее – без учета неоднородности памяти эффективную программу для NUMA уже не напишешь.

3.Наконец, последний тип многопроцессорных систем – кластеры. Просто берем некоторое количество “почти самостоятельных” компьютеров (узлы кластера или “ноды”) и объединяем их быстродействующими линиями связи. “Общей памяти” здесь может и не быть вообще. Эта система очень неудобна для программистов, и, существенно ограничена сфера применения. Но зато кластер – это очень дешево.

Intel сегодня предпочитает создавать SMP-системы; AMD, IBM и Sun – те или иные варианты NUMA. Основная “область применения” кластеров – суперкомпьютеры.


Идея многоядерного процессора выглядит на первый взгляд совершенно простой: просто упаковываем два-три (ну или сколько там влезет) процессора в один корпус – и компьютер получает возможность исполнять несколько программных потоков одновременно. Вроде бы бесхитростная стратегия… но конкретные её реализации в недавно вышедших настольных процессорах AMD и Intel заметно различаются. Различаются настолько, что сугубо “количественные” мелочи в конечном итоге переходят в качественные различия между процессорами этих двух компаний. Попробуем разобраться в различиях подходов конкурентов.


Intel.

При создании многоядерных процессоров для настольных ПК микропроцессорный гигант предпочел пойти на первых порах по пути “наименьшего сопротивления”, продолжив традиции создания привычных для себя SMP-систем с общей шиной. Выглядит подобная MP-система чрезвычайно просто: один чипсет, к которому подключается вся оперативная память, и одна процессорная шина, к которой подключены все процессоры. Никакой общей схемотехники у этих ядер нет.
Короче говоря Pentium’ы – простейшие “двухпроцессорные процессоры” – язык даже не поворачивается говорить о “ядрах”. Всё скучно до невозможности (впрочем, далеко не всегда двигает прогресс то, что “весело” :))…

Несмотря на все свои “подводные камни” такая реализация, в конечном счёте, позволила этой корпорации довольно быстро “завалить” прилавки дешевыми и доступными каждому двухъядерниками. Все сказанное больше касается Р4, про С2D в следующей статье.

Централизованный” подход Intel, во-первых, отличается относительной простотой, а во-вторых, удобен тем, что в нём каждый компонент компьютера получается узкоспециализированным, и поддающимся модернизации независимо от других компонентов. То есть с одним и тем же Northbridge можно использовать, например, совершенно различные по своей производительности и наоборот – меняя Northbridge, можно, например, использовать с одним и тем же процессором совершенно разные типы оперативной памяти..


AMD.


Архитектура AMD K8 не просто отличается от “интеловской”: она концептуально иная, поскольку в ней нет какого-то выделенного центра. Каждый из процессоров архитектуры AMD64 является независимой и “самодостаточной” единицей. С чисто технической стороны AMD попросту интегрировала практически всю функциональность северного моста в центральный процессор.
Но “небольшая” технологическая уловка приводит к совсем иной архитектуре компьютера – SUMA, в отличие от традиционной SMP. SUMA – это название AMD, обозначающее, что архитектура вроде относится к NUMA, но не столь “тормознутая”.

Основа SUMA – последовательная шина HyperTransport (об этой шине во второй части). В каждый процессор интегрируется контроллер “локальной” оперативной памяти (собственно, по сравнению с одноядерными процессорами AMD64 контроллер памяти почти не изменился).Обращения к памяти “чужих” процессоров происходят по шине HyperTransport, причем делается эта “переадресация” запросов абсолютно прозрачно для собственно вычислительного ядра процессора – ее осуществляет встроенный в Northbridge коммутатор (CrossBar), работающий на полной частоте процессора. Этот же самый CrossBar обеспечивает “автоматическую” маршрутизацию проходящих через процессор сообщений от периферийных устройств и других процессоров, включая обслуживание “чужих” запросов к оперативной памяти HT специально оптимизировалась для подобного режима работы. Шина позволяет одновременно передавать данные на скорости в “обе стороны” до 8 Гбайт/с суммарно. Модель памяти получается неоднородной (NUMA), но различия в скорости “своих” и “чужих” участков оперативной памяти получаются относительно небольшими.
Чипсет сильно упрощается: всё, что от него требуется – это просто обеспечивать “мосты” (туннели) между HT и другими типами шин. Ну и, возможно, заодно обеспечивать какое-то количество интегрированных контроллеров.
Здесь всё совместимо со всем: любые современные чипсеты для микроархитектуры AMD64, теоретически, должны работать и с любыми процессорами AMD… и любыми “правильно” сделанными “напарниками”. И, в частности, все двухъядерные процессоры AMD должны работать со всеми ранее выпущенными чипсетами для процессоров архитектуры K8.
AMD сейчас любит подчеркивать, что её процессоры “специально проектировались в расчёте на двухядерность”, но, строго говоря, правильнее было бы говорить, что двухядерность очень удачно ложится на её архитектуру. Каждый процессор K8 является “системой в миниатюре”, со своим “процессором” и Northbridge; а двухядерный K8 – “двухпроцессорная SMP-система в миниатюре”.

Интеграция Northbridge в процессор и SUMA-архитектура K8 не просто обеспечивает “более быстрый контроллер оперативной памяти”, – она заодно позволяет очень эффективно решать и ряд свойственных многопроцессорным системам проблем. Например, SUMA решает “проблему общей памяти”.

Правда, латентность(время отклика) оперативной памяти по меркам процессора остается по-прежнему огромной, но и с этой напастью научились эффективно бороться, используя кэш-память внушительных размеров и механизмы аппаратной и программной предвыборки из памяти. Однако стоит поставить в систему не одно, а два, четыре, а то и восемь процессорных ядер, как проблема “медленной памяти” всплывает с прежней силой – особенно в архитектуре SMP(читай Intel) с контроллером памяти в чипсепте:

На практике это выливается в “проблему масштабируемости” – когда использование нескольких процессоров не приводит к ожидаемому приросту производительности.

Считайте сами: если, например, одиночный процессор 20% своего времени простаивал, ожидая данных из оперативной памяти, то “двушка” будет простаивать 33% времени, а “четверка” – 50%. В пересчёте на общую производительность, 1P-система работает со скоростью 100%, 2P-система – со скоростью 167% (вместо расчётных 200%), а 4P-система – со скоростью 250% (вместо 400%). Более того: получить даже пятикратный прирост производительности в данном случае невозможно в принципе (см. график ниже)! И ничего с этим поделать невозможно. Интересно, кстати, что этот эффект свойственен исключительно многопроцессорным системам: если в примере выше заменить оперативную память на вдвое более быструю, то производительность однопроцессорной системы возрастет лишь на жалкие 11%. (Такие “ужасы” получаются в программах, которые много времени проводят в ожидании данных от памяти (не из кэша, а именно из ОЗУ: если у нас программа почти всегда работает с кэшем – никаких проблем не возникает). То есть если на одном процессоре 80% времени вычислений и 20% ожидания данных из памяти, то на двух получаем “40%” вычислений и “20%” ожидания данных из памяти (в пересчёте к “старым” процентам); выигрыш составляет 100/60 = 167%. И так далее. Ставим вдвое более быструю память – получаем на двухпроцессорной системе “80%” вычислений и “10%” ожидания данных из памяти; выигрыш – 100/90=111%).

В идеале любая многопроцессорная система должна быть хорошо сбалансирована – слишком быстрая память обходится слишком дорого; слишком медленная – сводит эффект от установки нескольких процессоров к минимуму. То есть если для однопроцессорной системы вполне достаточно двухканальной оперативной памяти DDR (а практика показывает, что это, скорее всего, так), то в “двушку” желательно установить четырехканальный, а в “квад” – восьмиканальный контроллер памяти DDR. Но на практике даже четырехканальный контроллер пока обходится слишком дорого: заикаться же о чем-то большем в “классических” SMP даже не приходится.

Но это всё – в SMP: а вот в NUMA (типа AMD-шной), где двухканальный контроллер памяти интегрирован в каждый процессор, суммарная производительность подсистемы памяти как раз и возрастает пропорционально количеству процессоров. Правда, у NUMA, как уже было сказано, “свои тараканы” – неоднородность скорости работы различных участков памяти.

Обычные SMP страдают еще и от “проблемы общей шины”: мало сделать быстрый контроллер памяти – нужно еще и обеспечить достаточно быструю передачу полученных из памяти данных к процессору. Что толку с того, что чипсет Intel 955X Express, поддерживает двухканальную оперативную память DDR2 667 МГц с пиковой пропускной способностью 10,7 Гбайт/с, если 800-мегагерцовая процессорная шина не позволяет “прокачивать” более 6,4 Гбайт/с? И ведь это еще не всё: чем больше процессоров мы помещаем на системную шину, тем сложнее обеспечить безошибочную передачу по ней данных (возрастает электрическая нагрузка, усложняется разводка). В итоге если один процессор свободно работает с шиной 800 и даже 1066 МГц, то два процессора уже вынуждены ограничиться шиной не выше 800 МГц, а четыре – так и вовсе работают только с шиной 667 МГц и ниже. Вот так всё неидеально получается для SMP. Мегабайты и даже десятки мегабайт кэш-памяти третьего уровня для них не роскошь, а жестокая необходимость.Intel, правда, нашла достаточно успешный способ отчасти обойти эту проблему, используя в новейших многопроцессорных системах сразу две независимых процессорных шины. Но в неоднородной AMD-шной SUMA-архитектуре этой проблемы-то вообще нет!В итоге эта “общая” шина у AMD получается настолько быстродействующая, что ядра друг другу практически не мешают – их ограничивает только пропускная способность оперативной памяти, да ведущих во “внешний мир” линков HyperTransport.

Подытожим, есть две архитектуры, два производителя, Intel – SMP , AMD – SUMA. У каждого свои
достоинства и свои недостатки. Но даже не это главное, процессоры без соответствующего программного обеспечения и ОС просто железки. Уже есть оптимизированные приложения для двухядерников – например Photoshop cs2 гораздо шустрее.

 

Многоядерные процессоры: технологии(Intel и AMD). Часть 2.


 

В первой части обзора рассматривалась архитектура многоядерных процессоров AMD&Intel. Однако при выборе процессора для персонального использования дома или в офисе, недостаточно выбирать только между SMP и SUMA архитектурой. Все же на сегодня нет значительного отрыва ни у одного из конкурентов, несмотря на разницу в архитектуре. Вернее отрыв есть, но какой-то неубедительный он. АМД хорош в одних задачах, Интел в других, получается среднее арифметическое. А например, при расчете числа Пи- утилитой Super PI- двухядерный Athlon x2 3800 проигрывает одноядерному Athlon 3500+, пусть на доли секунд, но всетаки.
В этой части рассмотрим технологии Hyper Threading, Hyper transport.

 

Hyper Threading


Несмотря на отставание от AMD в 64 битных технологиях, а также проигрывая в производительности 2-х ядерных десктопных процессоров(до C2D), Intel все же тратила и тратит денег на исследования много больше AMD. И всегда имеет чего-нибудь в загашнике. У пентиумов уже была микроархитектура NetBurst, а всем известный Hyper Threading является в каком-то смысле её логическим продолжением.(еще в 2001 году)
Микроархитектура Intel NetBurst позволяет получить максимальный выигрыш в производительности при выполнении одиночного потока инструкций, то есть при выполнении одной задачи. Однако даже в случае специальной оптимизации программы не все исполнительные модули процессора оказываются задействованными на протяжении каждого тактового цикла. В среднем при выполнении кода, типичного для набора команд IA-32, реально используется только 35% исполнительных ресурсов процессора, а 65% исполнительных ресурсов процессора простаивают, что означает неэффективное использование возможностей процессора. Было бы вполне логично реализовать работу процессора таким образом, чтобы в каждом тактовом цикле максимально использовать его возможности. Именно эту идею и реализует технология Hyper-Threading, подключая незадействованные ресурсы процессора к выполнению параллельной задачи.
Сейчас трудное предложение 🙂
Данная технология является чем-то средним между многопоточной обработкой, реализованной в мультипроцессорных системах, и параллелизмом на уровне инструкций, реализованном в однопроцессорных системах.
А если проще, то технология Hyper-Threading позволяет организовать два логических процессора в одном физическом.



Посмотрим на рисунок. Синими квадратами изображены команды одного потока, а розовыми второго. Видно, что в принципе они используют различные регистры процессора, а большая часть регистров простаивает. Для выполнения первого и второго потока последовательно, процессор затратит 10 тактов(каждый поток по 5 тактов). Принцип Hyper Threading как раз и состоит в том, чтобы использовать незадействованные регистры процессора для параллельной обработки второго потока. Но идеальных ситуаций не бывает. Вот и в нашем случае, в одни и теже регистры пытается записаться и первый и второй поток. Поэтому выполнение 2х потоков с использованием Hyper Threading заняло не 5, а 7 тактов.

Этот козырь Интел использовало также и в 2х ядерных Pentium Extreme Edition. Так из физически двухядерного, получился логически четырехядерный процессор!!
Сейчас с переходом на C2D, Интел отказывается от Hyper-Threading, он остается только на Celeron D. Кстати, именно поэтому процессоры Celeron D не будут спешить расстаться с архитектурой NetBurst. Другими словами, процессоры Celeron на ядре Conroe пока не появятся, данное семейство бюджетных процессоров будет использоваться для “утилизации” имеющихся запасов ядер Prescott и CedarMill. То есть для продажи под видом Celeron, остатков старых процессоров. Однако слишком уж проста и с той же стороны перспективна эта технология для полного отказа от нее.


HyperTransport


Теперь перейдем к АМД. Кроме выпуска первых десктопных 64 битных процессоров, чем АМД конечно годится,( причем гордится настолько, что решила отказаться от магических циферок 64 в названии процессора -мол если написано Athlon, то и так ясно, что процессор 64 битный) у компании есть еще один мощный предмет для гордости.


Шина HyperTransport (HT), ранее известная как Lightning Data Transport (LDT), – это двунаправленная последовательно/параллельная компьютерная шина, с высокой пропускной способностью и малыми задержками.
Исторически HyperTransport разрабатывался AMD в качестве процессорной шины нового поколения специально для чипов с интегрированным контроллером памяти (архитектура AMD64). В многопроцессорных системах на основе AMD Opteron подсистема памяти “размазана” по всем процессорам – у каждого есть своя локальная память, подключенная через интегрированный контроллер, и каждый может обращаться к памяти любого другого процессора. Локальная память “быстрая”, а память соседа – “медленная”, причем чем “дальше” расположен сосед, тем медленнее память. Медлительность является следствием того, что для обращения к соседу требуется проделать целый ряд операций – переслать по межпроцессорной шине запрос, дождаться его выполнения контроллером памяти адресата, вернуть данные по шине обратно. Очевидно, что чем быстрее при этом шина, тем более “однородна” память.

Исходя из этих соображений и проектировалась новая шина, призванная обеспечить пропускную способность не меньшую, чем у оперативной памяти, и минимальные задержки на передачу данных и сообщений. Получилось действительно неплохо, что даже дало AMD повод назвать свою архитектуру не NUMA, а SUMA – Slightly Uniform Memory Architecture, то есть “почти однородная” архитектура памяти.(напомню NUMA -неоднородный доступ к памяти).
Но разработчики не стали делать типичную быструю узкоспециализированную процессорную (системную) шину. Напротив, в соответствии с веяниями времени они соорудили очень быструю последовательную шину данных и предусмотрели возможности для ее “переноса” в более простые и медленные варианты с уменьшенными частотами и разрядностью (в отличие от PCI Express, которая масштабируется “вверх” – от x1 к х16 и x32).
Поэтому HT (минимальная ширина которой – 2 бита) с полным правом может называться последовательной шиной – любые данные, передаваемые по ней, упаковываются в пакеты стандартного вида. Правда, требования скорости наложили на протокол передачи данных сильнейшие ограничения – столь изящной “layered architecture”, как у Intel, мы здесь не увидим, да и влияние физической реализации линков HT на общую архитектуру шины очень заметно.
HyperTransport поддерживает автоматическое определение ширины шины, от 2-х битных линий до 32-х битных линий. Полноразмерная, полноскоростная, 32-х битная шина в двунаправленном режиме способна обеспечить пропускную способность до 20800 МБ/с (2*(32/8)*2600), являясь, таким образом, самой быстрой шиной среди себе подобных.


“Базовая” тактовая частота шины HT – 200 МГц (то есть частота передачи данных – 400 МГц). Это минимально возможная частота функционирования шины, она определяет и минимальную пропускную способность HT-линка: 2 бита (минимальная ширина направления) x 200 МГц (минимальная частота) x 2 (DDR) = 100 Мбайт/с. В отличие от PCI Express, где 20% от этой величины “съедает” кодирование “8/10”, это “честные” 100 Мбайт/с, то есть теоретически все они доступны устройству (пакетирование, конечно, снизит реальную пропускную способность). Все последующие тактовые частоты определяются как кратные данной – 400 МГц, 600 МГц, 800 МГц (HyperTransport 1.0-1.1), 1000 МГц (последние ревизии HT 1.x и HT 2.0), 1200 и 1400 МГц (HT 2.0) 2600МГц; (сравните с шиной PCI и её 33 или 66 МГц)


Столь широкого спектра скоростей за глаза хватает для любых применений – от простейших до сверхпроизводительных. Неудивительно, что HT получил широчайшую поддержку в тех областях, где производительность критична (см. врезку в конце статьи) – эта шина с успехом используется помимо AMD Athlon 64/Opteron еще и в новейших процессорах Apple G5 (IBM) и сопутствующих чипсетах, в процессорах Transmeta, в разнообразных сетевых устройствах (Cisco, Broadcom), в чипсетах Nvidia и ALi/ULi.4

В принципе технология могла бы с легкостью занять место PCI Express. Этому мешает только неудобство протоколов передачи, которые, вообще говоря, можно было бы и перекрыть вышележащими протоколами, – но Intel предложила свою, совершенно иную альтернативу, а на разработку собственной шины общего назначения (3GIO) на базе HT у AMD, видимо, не хватило ресурсов.

Однажды разработанный мост PCI-HyperTransport позволяет взаимодействовать любому процессору, поддерживающиму шину HyperTransport и любому устройству шины PCI. Для примера, NVIDIA nForce чипсет использует шину HyperTransport для соединения между северным и южным мостами.

Шина HyperTransport поддерживает технологии энергосбережения, а именно ACPI. Это значит, что при изменении состояния процессора (C-state) на энергосберегающее, изменяется также и состояние устройств (D-state). Например, при отключении процессора НЖМД также отключаются.

Отличие HT от других последовательных пакетных протоколов в том, что при передаче одного пакета, возможно прервать передачу, и передать второй – более срочный. Такая экзотическая на первый взгляд схема нужна для обеспечения экстремально низких задержек передачи сообщений: при достаточно широкой шине типичная задержка передачи сообщения в НТ составляет 1-2 такта.


* * * * *

Еще немного о программировании под многоядерные системы. На самом деле SMP и NUMA(SUMA), не такие уж и разные, у них есть сходство – общая память. То есть каждое ядро работает со всей доступной памятью.
В языке программирования C возможно распараллеливание программ посредством вызова соответствующих системных функций, а в компиляторах с языка FORTRAN этот механизм используется либо для автоматического распараллеливания, либо в режиме задания распараллеливающих директив компилятору (такой подход поддерживают и компиляторы с языка С). Все производители симметричных мультипроцессорных систем в той или иной мере поддерживают стандарт POSIX Pthread и включают в программное обеспечение распараллеливающие компиляторы для популярных языков программирования или предоставляют набор директив компилятору для распараллеливания программ. В частности, многие поставщики компьютеров SMP архитектуры (Sun, HP, SGI) в своих компиляторах предоставляют специальные директивы для распараллеливания циклов.
Вот в прошлой статье, товарищ паниковал, что не будет нормального програмного обеспечения под разные архитектуры. Не паникуйте товарищ будет. Обязательно будет.

www.nnm.ru

By Ruslan Novikov

Интернет-предприниматель. Фулстек разработчик. Маркетолог. Наставник.