Что обещает и что дает рабочим станциям AMD Threadripper 3970X

Процессор AMD Ryzen Threadripper 3970X может стать наи­бо­лее ин­те­рес­ным пред­ло­же­ни­ем для вы­со­ко­про­из­во­ди­тель­ных ра­бо­чих стан­ций. Там, где тре­бу­ет­ся осо­бая глу­би­на рас­че­тов с дли­тель­ной наг­руз­кой, плат­фор­ма Castle Peak спо­соб­на пре­тен­до­вать на ве­ду­щие по­зи­ции в рей­тин­ге про­из­во­ди­тель­но­с­ти. По­че­му именно AMD Thre­ad­rip­per 3970X? Почему не его старший 64-ядерный брат Threadripper 3990X, уже за­све­тив­ший­ся в юпи­те­рах сце­ны?

Горшочек, не вари!

AMD Threadripper 3970X отличается удач­ным сочетанием количества вы­чис­ли­тель­ных ядер и технологии Si­mul­ta­ne­o­us Mul­ti­thread­ing. Четыре CCD-чип­ле­та в рамках архитектуры Zen 2 формируют 32-ядер­ную кон­ст­рук­цию про­цес­со­ра, а SMT при не­об­хо­ди­мо­с­ти удваивает это количество. 64 про­цес­со­ра, со­глас­но пред­став­ле­ни­ям Mic­ro­soft, — граница, за ко­то­рой возможны ос­ло­ж­не­ния.

Несмотря на то, что Windows Server поддерживает до 256 логических ядер, их организация предполагает раз­де­ле­ние плат­фор­мы на процессорные группы, в каждой из которых не более 64 ядер — их «ат­ри­бу­ция» вы­пол­ня­ет­ся с по­мо­щью Af­fi­ni­ty-масок и других битовых карт, где каж­до­му ядру (или про­цес­со­ру) со­от­вет­ст­ву­ет один бит. Опе­ри­ро­ва­ние дан­ны­ми сущ­но­с­тя­ми, согласно Microsoft x64 calling con­ven­tion, требует 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 настроена управлять про­из­во­ди­тель­но­стью и элек­т­ро­пи­та­ни­ем в ав­то­ре­жи­ме.

Установки P-State по умолчанию для процессоров семейства Threadripper в AMD Common BIOS Specifications системной платы ASUS Prime TRX40-Pro

 

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

Пользователи системной платы ASUS Prime TRX40-Pro могут маневрировать значением тактовой частоты, выбирая подходящий режим питания по линиям VID

 

В разделе AMD CBS есть еще несколько важ­ных установок:

В любом случае, всегда можно повозиться с поиском наиболее про­из­во­ди­тель­но­го про­фи­ля, от­ве­ча­ю­ще­го по­треб­но­с­тям кон­к­рет­но­го приложения, чтобы оп­ти­ми­зи­ро­вать принудительную миг­ра­цию по­то­ков меж­ду вы­чис­ли­тель­ны­ми яд­ра­ми. Именно в этом суть технологии CPPC — обеспечить рав­но­мер­ный нагрев про­цес­сор­ных крис­тал­лов.

Традиционно, количество межъядерных ми­г­ра­ций за единицу времени принято минимизировать, поскольку при их вы­пол­не­нии контекст потока, оставшийся в кэше покинутого ядра, становится ненужным, а ядро, в ко­то­рое произошла ми­гра­ция, дол­жно повторно загрузить в свой кэш те­ку­щий контекст потока. В итоге такая ми­г­ра­ция уменьшает эф­фек­тив­ность кэш-па­мя­ти и сопровождается кэш-промахами, которые неизбежно сни­жа­ют про­из­во­ди­тель­ность, а NUMA-оп­ти­ми­за­ция AMD Threadripper 3970X, потребность в ко­то­рой, как мы знаем, нивелирована не полностью, вно­сит свои коррективы в оптимальный выбор ядра для вы­пол­не­ния каждого по­то­ка.

С другой стороны, все зависит от частоты такой миграции. Если аргументы для ее использования лежат в об­лас­ти тер­мо­ди­на­ми­ки, то процессы весьма инер­ци­он­ны, а значит частота миграции не будет высокой и опасения по по­во­ду по­вы­ше­ния частоты кэш-промахов преувеличены.

Технически, такую миграцию может вы­пол­нять даже приложение, используя Af­fi­ni­ty-маски. Планировщик Mic­ro­soft Win­dows тем более способен распознавать «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 Pre­da­tor Black Kingston (HX432C16PB3K2/32) всех че­ты­рех ка­на­лов памяти.

Зависимость латентности L3-кэш процессора AMD Ryzen Threadripper 3970X от размера обрабатываемого блока данных

 

Кривая латентности, если пренебречь глитчами, асимптотически приближается к отметке 104 нс. Это до­воль­но по­сред­ст­вен­ный результат, что видно по рейтингу тестирования процессора AMD Thread­ripper 3970X ди­аг­но­сти­че­ской ути­ли­той AIDA64.

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

Латентность L3-кэш процессора AMD Ryzen Threadripper 3970X глазами утилиты AIDA64

 

Очевидно, в силу влияния кэш-памяти, TLB, особенностей физической организации за­по­ми­на­ю­щей матрицы DRAM и других факторов, латентность выражено зависит от объема об­ра­ба­ты­ва­е­мых данных и ко­ли­че­ст­ва по­то­ков. Об этом следует по­мнить, сравнивая график латентности NCRB (ма­шин­ный код измерительного фраг­мен­та вы­ве­ден зеленым цветом в правой верх­ней части графика) и скалярной ве­ли­чи­ны, выдаваемой AIDA64 (алгоритм фор­ми­ро­ва­ния и ус­ред­не­ния которой ос­тал­ся за кадром).

Фактором, работающим в пользу AIDA64, является наличие подписанного Kernel Mo­de драйвера, что по­зво­ля­ет бес­пре­пят­ст­вен­но воспользоваться системными при­ви­ле­ги­я­ми, в частности обеспечить мо­но­поль­ное вы­пол­не­ние из­ме­ри­тель­но­го по­то­ка, применить большие страницы (Large Pages) и т.п.

Особый интерес представляет эф­фек­тив­ность AVX256-операций по сравнению с SSE128 — AMD Thread­ripper 3970X де­кла­ри­ру­ет полноценный 256-битный век­тор­ный тракт, принципиально важный для ог­ром­но­го чи­с­ла муль­ти­ме­дий­ных при­ло­же­ний. Здесь особых сюрпризов нет:

Эффективность AVX256-записи в многопоточных операциях процессора AMD Ryzen Threadripper 3970X

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

Несколько выходя за рамки исследуемой области, заметим, что в операциях с L1-кэш, производительность ко­то­рой ком­пле­мен­тар­на возможностям век­тор­но­го трак­та, процессор успешно демонстрирует дву­крат­ный рост про­из­во­ди­тель­но­с­ти опе­ра­ций AVX256 в сравнении с SSE128, по­э­то­му нет оснований вос­при­ни­мать по­лу­чен­ный ре­зуль­тат как повод усомниться в пол­но­те 256-битной оптимизации.

Метрики производительности кэш-памяти L1
Чтение SSE128 Чтение AVX256
Запись SSE128
Запись AVX256

В случае доступа к L1, время выполнения 256-битной AVX-инструкции VMOVAPD и 128-битной SSE-ин­ст­рук­ции MOV­APS прак­ти­че­ски совпадает, что обеспечивает пе­ре­да­чу вдвое большего количества дан­ных за еди­ни­цу времени в слу­чае ис­поль­зо­ва­ния 256-битной инструкции.

Эффективность SSE128-записи в многопоточных операциях процессора AMD Ryzen Threadripper 3970X

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

Эффективность AVX256-чтения в многопоточных операциях процессора AMD Ryzen Threadripper 3970X

Как и на графике латентности, скорость 256-битного чтения испытывает сильное влияние кэш-памяти. Мет­ри­ки про­из­во­ди­тель­но­с­ти приходят в урав­но­ве­шен­ное со­сто­я­ние на отметке 4МБ.

Важным отличием тестов пропускной способности оперативной памяти от ана­ло­гич­ных тестов кэш-памяти яв­ля­ет­ся так называемая non-temporal оптимизация, со­сто­я­щая в подавлении кэширования для опе­ра­ций с боль­ши­ми объе­ма­ми DRAM. Это по­зво­ля­ет уменьшить накладные рас­хо­ды в ситуациях, когда объем об­ра­ба­ты­ва­е­мых данных пре­вы­ша­ет объем кэш-па­мя­ти. Группа процессорных инструкций, обес­пе­чи­ва­ю­щая та­кую оп­ти­ми­за­цию, клас­си­фи­ци­ру­ют­ся как hints, что в пе­ре­во­де означает «намек». Этим под­чер­ки­ва­ет­ся ре­ко­мен­да­тель­ный характер дан­ных ин­ст­рук­ций, в то время как окон­ча­тель­ное решение использовать или не ис­поль­зо­вать кэш принимает процессор на ос­но­ва­нии Im­ple­men­ta­tion-Specific ал­го­рит­мов.

Практика исследования нескольких по­ко­ле­ний процессоров Intel и AMD по­ка­зы­ва­ет, что non-temporal оп­ти­ми­за­ция в боль­шин­ст­ве случаев безусловно от­ра­ба­ты­ва­ет­ся для записи, в то время как при чтении, боль­шин­ст­во процессоров иг­но­ри­ру­ют этот механизм. Именно этот случай мы и ви­дим на графиках.

Загадки L3-кэш

Политика кэширования данных в рамках архитектуры Zen 2, формирующей лицо все­го семейства про­цес­со­ров AMD Thre­ad­rip­per, становится архиважным фактором производительности. Общий L3-кэш может су­щест­вен­но повлиять на си­ту­а­цию, по­мес­тив в себя весь обрабатываемый блок данных. В противном случае ге­не­ри­ру­ет­ся DRAM-трафик со зна­чи­тель­ны­ми по­те­ря­ми, во всяком случае для 4-крис­таль­но­го про­цес­со­ра.

Рассмотрим производительность L3 в мно­го­по­точ­ном режиме, активно ис­поль­зу­ю­щем векторное чтение — рас­хо­жий сце­на­рий для всех типовых нагрузок.

Производительность L3-кэш в многопоточном режиме чтения векторными AVX-операциями

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

Производительность L3-кэш в однопоточном режиме чтения векторными AVX-операциями

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

Во-первых, операционная система может ограничить аппетиты приложения, ис­поль­зуя технологию L3 cache al­lo­ca­tion technology, документированную в CPUID. Это по­зво­ля­ет ОС быть арбитром при рас­пре­де­ле­нии кэш-памяти между по­то­ка­ми.

Операционная система может ограничить аппетиты приложения, используя технологию L3 Cache Allocation Technology, о наличии которой свидетельствует CPUID процессора AMD Ryzen Threadripper 3970X

 

Во-вторых, в документе «Pre­li­mi­na­ry Pro­ces­sor Prog­ram­m­ing Reference» ут­верж­да­ет­ся, что 16MB блок L3-кэш, при­над­ле­жа­щий CCX-комплексу, разделен на четыре фраг­мен­та (4 MB L3 slice), при этом детальное опи­са­ние прин­ци­пов и целей такого разделения в до­ку­мен­та­ции от­сут­ст­ву­ет. Теоретически, это может быть доступ в ре­жи­ме чередования (интерлива) банков или ассоциация каждого из банков с одним ядром. Документ не уточ­ня­ет чис­лен­ные ха­рак­те­рис­ти­ки такой ассоциации: раз­ли­ча­ет­ся ли латентность доступа к «сво­е­му» и «чу­жо­му» фрагменту, а если раз­ли­ча­ет­ся то насколько? Тем не менее, на­ли­чие такой фраг­мен­та­ции, осо­бен­но в ус­ло­ви­ях мно­го­по­точ­но­го до­сту­па, может ска­зать­ся на ла­тен­т­но­с­ти L3 в за­ви­си­мос­ти от объе­ма бло­ка.

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

 

Очевидно, реализовать статическое ОЗУ, пропускная способность которого эф­фек­тив­но масштабируется меж­ду не­сколь­ки­ми потоками, достаточно трудно, особенно при условии сохранения при­ем­ле­мо­го тер­маль­но­го режима и раз­гон­но­го по­тен­ци­а­ла, о которых говорилось выше. Можно допустить, что в рамках CPPC-тех­но­ло­гии сегрегация 16MB-блоков L3-кэш на суб-блоки меньшего объема стала тем ком­про­мис­сом, ко­то­рый позволил решить за­да­чу адап­тив­ной ба­лан­си­ров­ки нагрузки на про­цес­сор­ные ядра.

Послесловие

Сумма технологий, реализованных в AMD Threadripper 3970X приближает нас к по­ни­ма­нию, почему в со­вре­мен­ных CPU на­счи­ты­ва­ет­ся уже не один десяток про­цес­сор­ных ядер. Ведь если нагрузку распределить так, что­бы в каждом CCX-комплексе работало только одно ядро, монопольно владеющее 16MB L3-кэш од­но­го ком­п­лек­са, то фактор кон­ку­рен­ции за доступ к L3 будет су­щест­вен­но ни­ве­ли­ро­ван. При этом мак­си­маль­но воз­мож­ное количество по­то­ков, ко­то­рым можно дать в мо­но­поль­ное распоряжение блок 16MB L3, бу­дет рав­но количеству CCX, то есть об­ще­му ко­ли­че­ст­ву ядер, разделенному на че­ты­ре. Чем больше CCX, тем бо­ль­ше таких по­то­ков.

Арифметически очевидно, что при уве­ли­че­нии ядер в процессоре, уве­ли­чи­ва­ет­ся и количество «из­бран­ных» ядер. В этом смысле запас ядер действительно по­вы­ша­ет возможности. Реализовать такую кон­цеп­цию мо­жет как ОС, так и при­к­лад­ной софт, соответствующим об­ра­зом выбирая нужные ядра в Affinity-мас­ках. Труд­но про­г­но­зи­ро­вать, на­ско­ль­ко раз­ра­бот­чи­ки ОС и прикладного ПО под­дер­жат столь рас­то­чи­тель­ную фор­му аф­фи­ни­за­ции.

Буду­щее процессоров семейства Thread­ripper тоже неочевидно. Ясно одно: ры­ноч­ная до­ступ­ность sTRX4-плат­форм — уже не про­ст­ран­ст­во для стен­до­вых экс­пе­ри­мен­тов, а воз­мож­ность оп­ро­бо­вать в деле потенциал AMD на ма­те­рин­ских пла­тах класса ASUS Prime TRX40-Pro. Умеренность их дизайна не сдерживает про­из­во­ди­тель­ность ничем, кроме готовности приложений и творческой энергии пользователя. Ве­ду­щие обоз­ре­ва­те­ли в се­рии тес­тов от Adobe в один го­лос признают доминирование AMD Thread­ripper 3970X. Мы при­со­е­ди­ня­ем­ся к этой оцен­ке с ря­дом ого­во­рок, озвученных в дан­ной пу­бли­ка­ции.

Процессор AMD Thre­ad­rip­per 3970X
предоставлен представительством компании AMD в Украине

Системная плата ASUS Prime TRX40-Pro
предоставлена представительством компании ASUS в Украине

Оперативная память HyperX Predator Black
предоставлена представительством компании Kingston в Украине

Твердотельные накопители Seagate FireCuda 520
предоставлены представительством компании Seagate в Украине