Занимательная топология AMD EPYC

25 Сен 2018

Занимательная топология AMD EPYC

У AMD нет заоблачных продаж в серверном сегменте. Тем не ме­нее, но­вые про­цес­со­ры EPYC наш­ли путь к сер­дцу по­­тре­­би­­те­лей. Но це­на на сер­вер­ные чи­пы AMD не мог­ла стать оп­ре­де­ля­ю­щим фак­то­ром без при­ем­ле­мо­го уров­ня фун­к­ци­о­наль­но­сти: ком­па­ния вторг­лась на ры­нок, где вы­со­кую план­ку по­ста­вил Intel.

Сравнивая две архитектуры, эксперты приводят в при­мер плотность про­цес­сор­ных ядер на од­но про­цес­сор­ное гнез­до. У In­tel Xe­on это 28 ядер, у AMD EPYC – на 4 боль­ше. На­сколь­ко хо­ро­шо спра­ви­лись раз­ра­бот­чи­ки с эф­фек­тив­ной ре­а­ли­за­ци­ей столь на­сы­щен­но­го ре­ше­ния? Тес­ти­ро­ва­ние од­но­со­кет­ной сер­вер­ной плат­фор­мы ASUS KNPA-U16, ос­на­щен­ной EPYC 7351Pдает воз­мож­ность по­нять, чем взял про­цес­сор от AMD.

Комплексное решение

Корпус процессора AMD EPYC (проект Naples) содержит четыре кристалла, каждый из которых разделен на два кластера CCX (Core Complex). Каждый из таких кластеров, в свою очередь, в зависимости от модели процессора, может содержать до четырех вычислительных ядер. В случае применения SMT-технологии, каждое ядро может быть представлено двумя логическими процессорами.

NUMA-топология процессора AMD EPYC: кристалл, разделенный на два кластера, изображен справа
Рис 1. NUMA-топология процессора AMD EPYC: кристалл, разделенный на два кластера, изображен справа

Исходя из топологии Naples, вычислим количество логических процессоров в максимальной конфигурации од­но­со­кет­ной платформы:

  • 4 кристалла на процессор
  • 2 кластера CCX на кристалл
  • 4 вычислительных ядра на CCX-кластер
  • 2 потока на ядро, при условии использования SMT

Перемножив топологические параметры, получим 64 логических процессора. Платформа с AMD EPYC 7351P 16-Core Processor, побывавшая в нашей тестовой лаборатории, обладает более скромными параметрами – 32 ло­ги­че­ских процессора.

Топологическая иерархия

Если уровни кэш-памяти L1 и L2 являются приватными ресурсами каждого из ядер, то объем кэш-памяти третьего уровня для процессора AMD EPYC 7351P 16-Core Processor определен как 64 мегабайта на процессорный корпус, ины­ми словами на сокет.

Для процессоров AMD суммарный объем кэш-памяти L3 многокристальной процессорной микросхемы, определяется с помощью функции CPUID 80000006h
Рис 2Для процессоров AMD суммарный объем кэш-памяти L3 многокристальной процессорной микросхемы, определяется с помощью функции CPUID 80000006h

Несмотря на такую формулировку, часто используемую в популярных описаниях, речь не идет о наличии единого запоминающего пространства такого размера. Вместо этого, каждый из CCX-кластеров содержит собственный блок L3-кэш, размером 8 МБ.

Для процессоров AMD объем кэш-памяти L3, приходящейся на CCX-кластер, определяется с помощью функции CPUID 8000001Dh
Рис 3Для процессоров AMD объем кэш-памяти L3, приходящейся на CCX-кластер, определяется с помощью функции CPUID 8000001Dh

По сравнению с монолитным, преимуществами такого решения является снижение уровня конкуренции при до­сту­пе вычислительных ядер к L3-кэш и снижение латентности, вследствие уменьшения топологического рас­сто­я­ния.

Исследование кластеризации L3
и эффектов на границе L3/DRAM

Попробуем экспериментально проверить поведение кэш-памяти L3-уровня, рассмотрев эффекты про­из­во­ди­тель­но­сти на границе с DRAM. Намеренно создав для процессора «неудобные условия» выполнения од­но­по­точ­ного кода, убедимся в том, что один обрабатываемый поток располагает только 8 МБ локальной кэш-памяти L3.

В силу того, что запись в память классической инструкцией MOV не использует non-temporal оптимизацию, а по­то­му кэшируется, тест оперативной памяти с ее применением наглядно демонстрирует эффект присутствия L3.

Запись в оперативную память без non-temporal оптимизации: один поток задействует один CCX-кластер одного NUMA-домена
Рис 4Запись в оперативную память без non-temporal оптимизации: один поток задействует один CCX-кластер одного NUMA-домена

Как видим, переполнение кэш-памяти L3 наступает при объеме обрабатываемого блока около 8 МБ. Итак, оп­ти­маль­ная утилизация ее полного объема, составляющего 64 МБ, возможна только в многопоточном коде, при учас­тии всех CCX-кластеров.

Запись в оперативную память с non-temporal оптимизацией: один поток задействует один CCX-кластер одного NUMA-домена, участие кэш-памяти нивелировано
Рис 5Запись в оперативную память с non-temporal оптимизацией: один поток задействует один CCX-кластер одного NUMA-домена, участие кэш-памяти нивелировано

Поставленный эксперимент потребовал тщательного подбора условий, ведь если запись в память выполняется бо­лее производительными инструкциями SSE (MOVNTPD) – значит, с non-temporal оптимизацией – «ступеньку», об­ус­лов­лен­ную вли­я­ни­ем кэш-памяти, увидеть не удастся.

О памяти

Из приведенного выше скриншота следует, что скорость обмена с оперативной памятью у процессора AMD EPYC 7351P составляет около 32 GBPS. Для двухканального контроллера памяти эта цифра вполне соответствует ожи­да­ни­ям. Но ведь топология Naples предполагает оснащение каждого из четырех кристаллов процессора EPYC соб­ст­вен­ным двухканальным DRAM-контроллером.

Оценим теоретическую пропускную способность оперативной памяти в сумме для всего процессорного гнезда. Для этого потребуется перемножить эффективную частоту передачи данных (в нашем примере 2.4 ГГц), ко­ли­че­ство байт на один DRAM-канал (64 бита = 8 байт) и ко­ли­че­ство каналов.

2.4 GHz * 8 bytes per channel * 8 channels = около 153.6 GBPS

Критерий оптимальности требует, чтобы каждый из параллельно работающих логических процессоров, вза­и­мо­дейст­во­вал с оперативной памятью, обращаясь к ближайшему с точки зрения топологии DRAM-контроллеру – в нашем примере к тому, который находится с ним на одном кристалле. Тогда конкуренция за использование тра­фи­ка ОЗУ между потоками будет минимальной, а маршрут доступа — кратчайшим. Иными словами, нужно ми­ни­ми­зи­ро­вать количество транзакций, пересекающих границы NUMA-доменов.

NUMA-оптимизация в представлении Microsoft

Для выделения памяти с явным указанием оптимального домена в операционных системах Microsoft пред­ла­га­ет­ся использовать функцию VirtualAllocExNuma. Для ограничения множества процессоров, используемых опе­ра­ци­он­ной системой при выполнении заданного потока или группы потоков, есть функция SetThreadAffinityMask.

Применяя две указанные WinAPI-функции, программист устанавливает соответствие между диапазонами памяти и использующими их потоками в пределах одного NUMA-домена, чтобы вычислительное ядро обращалось к бли­жай­ше­му DRAM-контроллеру. Исключение – обмен информацией между потоками. Удельный вес таких операций для оптимального алгоритма может быть некритичным.

Отметим, что реализация указанных функций подразумевает рекомендательный характер. Нехватка памяти на заданном оптимальном NUMA-домене приведет к использованию памяти в другом месте. Это может дать не­ре­гу­ляр­ное, а потому трудно выявляемое снижение производительности.

Кроме того, для полной утилизации возможностей систем, содержащих более 64 логических процессоров, по­тре­бу­ет­ся отдельный редизайн приложений. Владельцы односокетных платформ с AMD EPYC на борту по этому по­во­ду могут не волноваться, а вот серверы с двумя и более процессорами для полной утилизации своих ресурсов по­тре­бу­ют особой совместимости прикладного ПО.

Почему? Потому что в архитектуре функций WinAPI такой важный параметр как affinity mask, определяющий учас­тие логических процессоров в заданной операции, изначально был определен как битовый вектор, фик­си­ро­ван­ной размерности – 64 бита. Поддержка большего количества процессоров требует разделения ресурсов SMP-платформы на группы (Processor Groups), в каждой из которых их может быть не более чем 64 устройства (не имеет значения, физических или логических). При этом программное обеспечение, написанное без учета этого факта, может использовать процессоры только одной группы.

Резюме

Для любой платформы, построенной в соответствии с принципами NUMA, требуется оптимизация программного обеспечения. Этот тезис, очевидный для систем на базе процессоров Intel и AMD, можно расширить и на все вы­чис­ли­тель­ные платформы. Вместе с тем «цена» неоптимального доступа зависит от того, насколько обмен с опе­ра­тив­ной памятью «чужого» домена медленнее по сравнению с доступом к ОЗУ «своего» домена. Другими сло­ва­ми – метрикой про­из­во­ди­тель­но­сти может стать дистанция между доменами.

Сравнение реализации процессора в виде монолитного кристалла (Monolithic Die) и многокристальной конструкции EPYC Multichip module
Рис 6. Сравнение реализации процессора в виде монолитного кристалла (Monolithic Die)
и многокристальной конструкции
EPYC Multichip module

Для платформ с двумя (еще хуже – четырьмя) процессорными гнездами оптимизация маршрутов к ОЗУ выглядит нетривиальной задачей. Дополнительную турбулентность в логику теперь вносят несколько процессорных чипов в одном сокете. Различие в производительности оптимизированного и не оптимизированного софта для них весь­ма заметно. В этом свете понятно желание AMD упростить жизнь интеграторам, предложив пусть и не уни­вер­саль­ное, но достаточно мощное односокетное решение – EPYC 7xx1P.

Теги: