Смекни!
smekni.com

Понятие многозадачности (стр. 2 из 3)

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.