Процессор AMD Ryzen Threadripper 3970X может стать наиболее интересным предложением для высокопроизводительных рабочих станций. Там, где требуется особая глубина расчетов с длительной нагрузкой, платформа Castle Peak способна претендовать на ведущие позиции в рейтинге производительности. Почему именно AMD Threadripper 3970X? Почему не его старший 64-ядерный брат Threadripper 3990X, уже засветившийся в юпитерах сцены?
Горшочек, не вари!
AMD Threadripper 3970X отличается удачным сочетанием количества вычислительных ядер и технологии Simultaneous Multithreading. Четыре CCD-чиплета в рамках архитектуры Zen 2 формируют 32-ядерную конструкцию процессора, а SMT при необходимости удваивает это количество. 64 процессора, согласно представлениям Microsoft, — граница, за которой возможны осложнения.
Несмотря на то, что Windows Server поддерживает до 256 логических ядер, их организация предполагает разделение платформы на процессорные группы, в каждой из которых не более 64 ядер — их «атрибуция» выполняется с помощью Affinity-масок и других битовых карт, где каждому ядру (или процессору) соответствует один бит. Оперирование данными сущностями, согласно Microsoft x64 calling convention, требует 64-битных переменных, что не оставляет шансов огромному семейству приложений на платформах, где более 64 ядер (или процессоров).
А как же Linux?
Linux выходит из положения, передавая в 64-битных переменных указатель на битовый вектор и его длину, что снимает проблему разрядности. В рамках одной процессорной группы это проигрывает подходу Microsoft, поскольку требует бо́льшего количества параметров. Заметим все же, что выбор операционной среды лежит главным образом в плоскости прикладного ПО.
Почему наши симпатии не на стороне 64-ядерного AMD Threadripper 3990X?
Приобретая 3990X, который чуть ли не вдвое дороже 3970X, мы платим за возможность получить в SMT-режиме 128 логических процессоров. Это стоит делать, если мы знаем, как принудить ресурсоемкий софт эффективно задействовать ядра не только лишь из одной процессорной группы. Ведь подключив к вычислениям вторую половину ядер, мы получим ожидаемую и полноценную прибавку к производительности.
Частота и производительность:
технология компромисса
Еще один аргумент за AMD Threadripper 3970X — его частотные характеристики. Рабочий диапазон процессора начинается с базовых 3,7 ГГц, достигая документированного разгонного потенциала в 4,5 ГГц. У Threadripper 3990X — это соответственно 2,9 ГГц и 4,3 ГГц. Несущественная, на первый взгляд, разница в значениях узаконенного разгона — совсем не в «безобидных» 200 МГц.
Самое время коснуться тонкой материи — технологии CPPC (Collaborative Power and Performance Control). В ее основе лежит адаптивная балансировка нагрузки на процессорные ядра с динамическим управлением тактовой частотой, доступом к управлению питанием и датчикам температурного режима процессорных кристаллов.
Аспекты тонкой настройки изложены в документе «Workload Tuning Guide» и их анализ выходит за рамки данной публикации. Тем не менее, из документа следует, что ключевым моментом в достижении наилучшей производительности является пункт меню, связанный с управляющим алгоритмом APB. Приняв во внимание рекомендации AMD, приступим к установкам UEFI BIOS.
Для экспериментов с AMD Threadripper 3970X мы выбрали добротного крепыша от ASUS, платформу Prime TRX40-Pro — пример базовой реализации на новом наборе системной логики. Сдержанный дизайн платы как бы напоминает о принципах lean manufacturing («бережливого производства») и настраивает целевого пользователя на дельный лад. Это хорошая боевая лошадь для работяг, где нужны скорости, а не светодиодные обвесы, склонные к излишнему потреблению мощности и неуместному тепловыделению.
По умолчанию системная плата ASUS Prime TRX40-Pro настроена управлять производительностью и электропитанием в авторежиме.

Следующий скриншот просто к сведению: на что могут рассчитывать энтузиасты-оверклокеры, которым приглянулась платформа ASUS Prime TRX40-Pro.

В разделе AMD CBS есть еще несколько важных установок:
В любом случае, всегда можно повозиться с поиском наиболее производительного профиля, отвечающего потребностям конкретного приложения, чтобы оптимизировать принудительную миграцию потоков между вычислительными ядрами. Именно в этом суть технологии CPPC — обеспечить равномерный нагрев процессорных кристаллов.
Традиционно, количество межъядерных миграций за единицу времени принято минимизировать, поскольку при их выполнении контекст потока, оставшийся в кэше покинутого ядра, становится ненужным, а ядро, в которое произошла миграция, должно повторно загрузить в свой кэш текущий контекст потока. В итоге такая миграция уменьшает эффективность кэш-памяти и сопровождается кэш-промахами, которые неизбежно снижают производительность, а NUMA-оптимизация AMD Threadripper 3970X, потребность в которой, как мы знаем, нивелирована не полностью, вносит свои коррективы в оптимальный выбор ядра для выполнения каждого потока.
С другой стороны, все зависит от частоты такой миграции. Если аргументы для ее использования лежат в области термодинамики, то процессы весьма инерционны, а значит частота миграции не будет высокой и опасения по поводу повышения частоты кэш-промахов преувеличены.
Технически, такую миграцию может выполнять даже приложение, используя Affinity-маски. Планировщик Microsoft Windows тем более способен распознавать «favored core» — процессорные ядра, обладающие наивысшим частотным потенциалом. Но если приложение попытается «аффинизировать» потоки, каков будет механизм управления приоритетами?
Злые языки утверждают, что сейчас даже на уровне ОС выбор лучшего ядра далек от совершенства: миграционные процессы пока что действенны только на уровне чиплетов. Все это вызывает законные опасения, которые подтверждаются авторитетным и компетентным источником, где автор приводит и численную оценку потерь при делегировании потока от менее «способного» ядра более «способному» — речь идет о 5–40 миллисекундах. Нам придется в эксперименте оценить эффективность кэш-памяти в контексте миграции процессорных потоков («Загадки L3-кэш»).
Исходя из сказанного, однозначно определить на промежуточном финише победителя в гонке частот не так-то просто. Гипотетически, AMD Threadripper 3970X может оказаться лучшим в силу своей частотной динамики и, как следствие, по причине меньших накладных расходов на миграцию рабочей нагрузки (в том числе, и за счет количества ядер). Более плотная компоновка процессорных кристаллов AMD Threadripper 3990X, вероятно, скажется на эффективности адаптивной балансировки. Впрочем, реальных данных для таких выводов пока нет.
Оперативная память:
эволюционный парадокс
Контроллер оперативной памяти в отдельном кристалле выгодно отличает новые Threadripper от предшественников. С четырьмя каналами DRAM этот процессор уверенно доминирует над AMD Ryzen, лишь слегка уступая AMD EPYC. Мы обратили внимание на эту парадоксальную ситуацию еще в августе, исследуя производительность оперативной памяти серверного чипа EPYC 7452. 30 января с.г. на сайте ServeTheHome в ситуации разбирался известный эксперт Патрик Кеннеди, опубликовав во многом созвучный материал.
Суть проблемы сводится к тому, что вынос DRAM-контроллера в отдельный кристалл привел к значительным ограничениям производительности оперативной памяти. Эти ограничения зависят от количества кристаллов CCD и частоты внутреннего тактового сигнала FCLK шины Infinity Fabric. У AMD Threadripper 3970X можно ожидать некоторых улучшений в силу оверклокерского потенциала, о чем свидетельствует график латентности, полученный заполнением модулями HyperX Predator Black Kingston (HX432C16PB3K2/32) всех четырех каналов памяти.

Кривая латентности, если пренебречь глитчами, асимптотически приближается к отметке 104 нс. Это довольно посредственный результат, что видно по рейтингу тестирования процессора AMD Threadripper 3970X диагностической утилитой AIDA64.
Обратим внимание на точку перегиба в окрестности 4МБ отметки. Она обусловлена переполнением L3 Cache: каждое из четырех ядер CCX-комплекса выбирает свой объем кэш из общего 16 МБ пространства. Мы чуть ниже проанализируем практику сегрегации L3, когда будем разбирать производительность кэш-памяти («Загадки L3-кэш»).

Очевидно, в силу влияния кэш-памяти, TLB, особенностей физической организации запоминающей матрицы DRAM и других факторов, латентность выражено зависит от объема обрабатываемых данных и количества потоков. Об этом следует помнить, сравнивая график латентности NCRB (машинный код измерительного фрагмента выведен зеленым цветом в правой верхней части графика) и скалярной величины, выдаваемой AIDA64 (алгоритм формирования и усреднения которой остался за кадром).
Фактором, работающим в пользу AIDA64, является наличие подписанного Kernel Mode драйвера, что позволяет беспрепятственно воспользоваться системными привилегиями, в частности обеспечить монопольное выполнение измерительного потока, применить большие страницы (Large Pages) и т.п.
Особый интерес представляет эффективность AVX256-операций по сравнению с SSE128 — AMD Threadripper 3970X декларирует полноценный 256-битный векторный тракт, принципиально важный для огромного числа мультимедийных приложений. Здесь особых сюрпризов нет:

Как видим, AVX256 не дает прироста по сравнению с SSE128. Это ожидаемо, ведь ограничивающим фактором здесь является шина DRAM, а не векторный тракт процессора. Но сравнив SIMD-операции разной длины можно сделать вывод об эффективности AMD Threadripper 3970X как вычислителя — независимо от размерности данных он в состоянии обеспечить стабильную производительность не хуже 81 GBPS.
Несколько выходя за рамки исследуемой области, заметим, что в операциях с L1-кэш, производительность которой комплементарна возможностям векторного тракта, процессор успешно демонстрирует двукратный рост производительности операций AVX256 в сравнении с SSE128, поэтому нет оснований воспринимать полученный результат как повод усомниться в полноте 256-битной оптимизации.
Метрики производительности кэш-памяти L1
Чтение SSE128 Чтение AVX256
Запись SSE128 Запись AVX256
В случае доступа к L1, время выполнения 256-битной AVX-инструкции VMOVAPD и 128-битной SSE-инструкции MOVAPS практически совпадает, что обеспечивает передачу вдвое большего количества данных за единицу времени в случае использования 256-битной инструкции.

В нашем эксперименте эффективная частота передачи данных определяется DDR CLK = 3,2 ГГц. Четыре канала оперативной памяти в состоянии обеспечить теоретический максимум пропускной способности на уровне 102.4 GBPS. Медианные результаты для чтения и записи DRAM находятся в пределах 81.7 … 83.2 GBPS. В любом случае, оснований для оптимистичных оценок в сравнении с тестами процессоров AMD EPYC, прибавилось.

Как и на графике латентности, скорость 256-битного чтения испытывает сильное влияние кэш-памяти. Метрики производительности приходят в уравновешенное состояние на отметке 4МБ.
Важным отличием тестов пропускной способности оперативной памяти от аналогичных тестов кэш-памяти является так называемая non-temporal оптимизация, состоящая в подавлении кэширования для операций с большими объемами DRAM. Это позволяет уменьшить накладные расходы в ситуациях, когда объем обрабатываемых данных превышает объем кэш-памяти. Группа процессорных инструкций, обеспечивающая такую оптимизацию, классифицируются как hints, что в переводе означает «намек». Этим подчеркивается рекомендательный характер данных инструкций, в то время как окончательное решение использовать или не использовать кэш принимает процессор на основании Implementation-Specific алгоритмов.
Практика исследования нескольких поколений процессоров Intel и AMD показывает, что non-temporal оптимизация в большинстве случаев безусловно отрабатывается для записи, в то время как при чтении, большинство процессоров игнорируют этот механизм. Именно этот случай мы и видим на графиках.
Загадки L3-кэш
Политика кэширования данных в рамках архитектуры Zen 2, формирующей лицо всего семейства процессоров AMD Threadripper, становится архиважным фактором производительности. Общий L3-кэш может существенно повлиять на ситуацию, поместив в себя весь обрабатываемый блок данных. В противном случае генерируется DRAM-трафик со значительными потерями, во всяком случае для 4-кристального процессора.
Рассмотрим производительность L3 в многопоточном режиме, активно использующем векторное чтение — расхожий сценарий для всех типовых нагрузок.

Как мы видим, спад производительности начинается около отметки 1 MB. Если разделить общий объем L3, равный 128 MB, на количество потоков, то получим 128/32 = 4 MB. Почему потоку доступно в 4 раза меньше L3, чем ожидается? Для того чтобы разобраться в ситуации, продолжим эксперименты с L3 в однопоточном режиме.

Сдвиг полочки производительности L3 с теоретического значения в 16 MB к отметке 14 MB можно объяснять TLB-промахами, при которых возникает необходимость чтения дескрипторов страниц из DRAM, что вносит задержки и порождает конкурирующий трафик. Но, скорее всего, мы наблюдаем в действии суперпозицию двух технологий, усиливающих позиции AMD Threadripper 3970X в HEDT-сегменте. Следует также учитывать, что заполнение кэш-памяти L3 в рассматриваемом процессоре происходит не при чтении DRAM, а при вытеснении данных, ранее кэшированных в L2. Это так называемый виктимный режим работы L3.
Во-первых, операционная система может ограничить аппетиты приложения, используя технологию L3 cache allocation technology, документированную в CPUID. Это позволяет ОС быть арбитром при распределении кэш-памяти между потоками.

Во-вторых, в документе «Preliminary Processor Programming Reference» утверждается, что 16MB блок L3-кэш, принадлежащий CCX-комплексу, разделен на четыре фрагмента (4 MB L3 slice), при этом детальное описание принципов и целей такого разделения в документации отсутствует. Теоретически, это может быть доступ в режиме чередования (интерлива) банков или ассоциация каждого из банков с одним ядром. Документ не уточняет численные характеристики такой ассоциации: различается ли латентность доступа к «своему» и «чужому» фрагменту, а если различается то насколько? Тем не менее, наличие такой фрагментации, особенно в условиях многопоточного доступа, может сказаться на латентности L3 в зависимости от объема блока.

Очевидно, реализовать статическое ОЗУ, пропускная способность которого эффективно масштабируется между несколькими потоками, достаточно трудно, особенно при условии сохранения приемлемого термального режима и разгонного потенциала, о которых говорилось выше. Можно допустить, что в рамках CPPC-технологии сегрегация 16MB-блоков L3-кэш на суб-блоки меньшего объема стала тем компромиссом, который позволил решить задачу адаптивной балансировки нагрузки на процессорные ядра.
Послесловие
Сумма технологий, реализованных в AMD Threadripper 3970X приближает нас к пониманию, почему в современных CPU насчитывается уже не один десяток процессорных ядер. Ведь если нагрузку распределить так, чтобы в каждом CCX-комплексе работало только одно ядро, монопольно владеющее 16MB L3-кэш одного комплекса, то фактор конкуренции за доступ к L3 будет существенно нивелирован. При этом максимально возможное количество потоков, которым можно дать в монопольное распоряжение блок 16MB L3, будет равно количеству CCX, то есть общему количеству ядер, разделенному на четыре. Чем больше CCX, тем больше таких потоков.
Арифметически очевидно, что при увеличении ядер в процессоре, увеличивается и количество «избранных» ядер. В этом смысле запас ядер действительно повышает возможности. Реализовать такую концепцию может как ОС, так и прикладной софт, соответствующим образом выбирая нужные ядра в Affinity-масках. Трудно прогнозировать, насколько разработчики ОС и прикладного ПО поддержат столь расточительную форму аффинизации.
Будущее процессоров семейства Threadripper тоже неочевидно. Ясно одно: рыночная доступность sTRX4-платформ — уже не пространство для стендовых экспериментов, а возможность опробовать в деле потенциал AMD на материнских платах класса ASUS Prime TRX40-Pro. Умеренность их дизайна не сдерживает производительность ничем, кроме готовности приложений и творческой энергии пользователя. Ведущие обозреватели в серии тестов от Adobe в один голос признают доминирование AMD Threadripper 3970X. Мы присоединяемся к этой оценке с рядом оговорок, озвученных в данной публикации.
Процессор AMD Threadripper 3970X
предоставлен представительством компании AMD в Украине
Системная плата ASUS Prime TRX40-Pro
предоставлена представительством компании ASUS в Украине
Оперативная память HyperX Predator Black
предоставлена представительством компании Kingston в Украине
Твердотельные накопители Seagate FireCuda 520
предоставлены представительством компании Seagate в Украине