Процессорная топология Zen 3: потери и находки

Впервые с 2007 года доля компании AMD в сег­мен­те x86-про­цес­со­ров до­стиг­ла мак­си­му­ма. В сег­мен­те на­столь­ных и сер­вер­ных про­цес­со­ров про­из­во­ди­тель за­фик­си­ро­вал са­мые вы­со­кие до­ли рын­ка, на­чи­ная с 2013 и 2011 гг., со­от­вет­ст­вен­но. Драй­ве­ра­ми рос­та вы­сту­пи­ла ар­хи­тек­ту­ра Zen2, уси­лен­ная не­ве­ро­ят­ным (в те­ку­щих ус­ло­ви­ях) ин­те­ре­сом по­ку­па­те­лей к Zen 3. На рын­ке но­ут­бу­ков ус­пеш­но стар­то­вал 7-на­но­вый про­цес­сор AMD Ryzen 4000 Renoir, обес­пе­чив ком­па­нии бо­лее 20% «слад­ко­го пи­ро­га» про­даж мо­биль­ных плат­форм. В сер­вер­ном сег­мен­те как ни­ког­да хо­рош ока­зал­ся EPYC 7002 Rome, от­во­е­вав­ший 1/16 часть в этой осо­бен­но при­быль­ной сфе­ре биз­не­са. В чем се­к­рет ус­пеш­но­го про­д­ви­же­ния чи­пов от AMD? От­вет да­ет не­пред­взя­тый вз­г­ляд на про­цес­сор­ную то­по­ло­гию.

Оценку преимуществ Zen 3, как нового топологического решения от AMD, начнем с анализа ограничений, при­су­щих пред­шест­вен­нику — Zen 2. Кэш-память L3 побывавшего у нас процессора 32-ядерного EPYC 7452 пред­став­ле­на клас­те­ра­ми, объемом по 16 MB. Именно этот объем доступен одному выполняемому потоку, со­глас­но ре­зуль­та­там вы­пол­не­ния ин­ст­рук­ции CPUID, функция 8000001Dh. Суммарный объем кэш-памяти L3 на одно процессорное гнез­до со­глас­но CPUID, фун­к­ции 80000006h, в данном случае со­став­ля­ет 128 MB.

В статье «Кэш-память L3 как зеркало производительности процессора AMD EPYC Rome» параметры, де­кла­ри­ру­е­мые ин­ст­рук­ци­ей CPUID, подвергаются практической проверке. Оценив зависимость фун­да­мен­таль­ных ди­на­ми­че­ских ха­рак­те­рис­тик — пропускной способности и латентности от объема об­ра­ба­ты­ва­е­мо­го блока, нетрудно видеть, что глав­ные точ­ки пе­ре­ги­ба — в окрестности X=16MB.

Как мог заметить внимательный читатель, близкое к идеальному соответствие теории и практики на­блю­да­ет­ся лишь в режиме Large Pages, когда влияние фактора TLB минимизировано, в то время как в режиме клас­си­че­ских 4-ки­ло­байт­ных страниц результат несколько «размывается» в силу переполнения TLB и, как след­ст­вие, необходимости чтения де­ск­рип­то­ров страниц из опе­ра­тив­ной памяти. Тем не менее, вне за­ви­си­мо­с­ти от тюнинга измерительного сценария, в мо­мент, когда объем информации, обрабатываемый од­ним потоком, пре­вы­ша­ет 16 MB, закономерно имеет мес­то рез­кое па­де­ние про­из­во­ди­тель­но­с­ти: ла­тен­т­ность растет, а про­пуск­ная способность падает.

Как следует из ниже приведенной иллюстрации, кристалл CCD процессора Zen 2 разделен на два блока CCX, каж­дый из ко­то­рых в свою очередь располагает блоком L3 объемом 16 MB и включает 4 вы­чи­с­ли­тель­ных ядра. Та­ким об­ра­зом, кристалл CCD содержит 8 ядер и 32 MB L3, но каждому из ядер до­ступ­но лишь 16 MB кэш-памяти «своего» CCX. Коммуникация между блоками CCX, расположенными на од­ном крис­тал­ле CCD, осуществляется посредством общего кристалла IOD.

Кристалл CCD процессора Zen 2 разделен на два блока CCX, каждый из которых в свою очередь располагает блоком L3 объемом 16 MB и включает 4 вычислительных ядра. Кристалл CCD процессора Zen 3 содержит один блок CCX, располагающий единым кластером L3 объемом 32 MB для восьми вычислительных ядер.

 

Переход к архитектуре Zen 3 состоит в уп­ро­ще­нии ие­рар­хии: кристалл CCD нового образца содержит один блок CCX, рас­по­ла­га­ю­щий единым кластером L3 объемом 32 MB для восьми вы­чис­ли­тель­ных ядер.

AMD Family 19h Model 20h-2fh

Как следует из документа Software Optimization Guide for AMD Family 19h Processors, процессоры Zen 3 по­ст­ро­е­ны на ос­но­ве об­нов­лен­ной топологии, по­зво­ля­ю­щей одному ядру эффективно использовать кэш-па­мять тре­тье­го уров­ня при об­ра­бот­ке блоков информации объемом до 32 MB. При этом количество ядер, раз­де­ля­ю­щих блок L3 возросло с 4 до 8. Важно подчеркнуть, что па­ра­мет­ры оп­ци­о­наль­ны и точное значение мо­жет за­ви­сеть от модели процессора.

Перейдем к менее оче­вид­ным различиям и сходствам, сравнив документацию процессоров двух поколений.

L3 Compare

Увы, латентность доступа к кэш-памяти L3 выросла с 39 до 46 тактов. Возможная причина — двукратное уве­ли­че­ние объема клас­те­ра. За­ви­сит ли рост латентности от количества ядер, создающих активную на­груз­ку на L3 в данный мо­мент времени? Этот во­п­рос, важный для однопоточных сценариев, пока остается от­кры­тым. Кроме того, для пе­ре­сче­та количества так­тов в на­но­се­кун­ды требуется знание тактовой частоты кон­к­рет­ной модели про­цес­со­ра, вернее, каждого вы­чис­ли­тель­но­го яд­ра, изменяющейся в силу действия ме­ха­низ­мов ди­на­ми­че­ско­го овер­кло­кин­га.

Согласно документации, оба поколения чипов используют виктимный принцип заполнения кэш-памяти L3. Его суть сво­дит­ся к то­му, что занесение информации в L3 происходит при ее вытеснении из L2. Важным мо­мен­том, ак­цен­ти­ро­ван­ным в документации AMD, является механизм non-temporal оптимизации, которая по­зво­ля­ет про­грам­мно­му обес­пе­че­нию ра­ци­о­наль­но использовать кэш-память, явным образом пред­от­вра­щая кэ­ши­ро­ва­ние од­но­крат­но ис­поль­зу­е­мых данных.

Выводы

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

Как известно, далеко не все современные приложения способны воспользоваться преимуществами боль­шо­го ко­ли­че­с­т­ва ядер. Причина может быть как в запаздывании поддержки продукта разработчиком, так и в объ­ек­тив­ных ог­ра­ни­че­ни­ях вы­чис­ли­тель­ных ал­го­рит­мов. Сценарии с небольшим количеством активно ра­бо­та­ю­щих потоков не следует расценивать, как исключительно синтетические. Обеспечение весьма до­стой­ных результатов при вы­пол­не­нии «кон­се­р­ва­тив­но­го» программного обеспечения традиционно яв­ля­ет­ся сильной стороной процессоров AMD.

Afterparty

Источник акцентирует внимание на драматических изменениях производительности двух инструкций из фун­к­ци­о­на­ль­но­го рас­ши­ре­ния BMI2 (Bit Manipulation Instructions 2). Это инструкции PDEP и PEXT. Согласно при­ве­ден­ной таб­ли­це, па­ра­метр Reciprocal Throughput (величина, обратная пропускной способности равная ко­ли­че­с­тву тактов, за­тра­чи­ва­е­мых на ин­ст­рук­цию) изменился с 250 (Zen2) до 1 (Zen3). Латентность (ко­ли­че­с­тво тактов ожидания ре­зуль­та­тов ин­ст­рук­ции) изменилась с 280 (Zen2) до 3 (Zen3). Изменения свя­за­ны с пе­ре­хо­дом от ми­кро­про­г­рам­мной ре­а­ли­за­ции ука­зан­ных ин­ст­рук­ций к ап­па­рат­ной.

InstLatX64

 

Информация частично совпадает с официальными документами AMD, заметим, что в Excel-таблицах, при­ла­га­е­мых к Op­ti­mi­za­tion Guide, «медленные» параметры для Zen2 не приводятся. А вот обновленные, «быст­рые» параметры для Zen3 уже есть в таблицах. Программистов призывают использовать инструкции PDEP и PEXT для процессоров Family 19h, в то время, как для предыдущего поколения чипов из-за низкой про­из­во­ди­тель­но­с­ти дан­но­го ап­па­рат­но­го ре­ше­ния прак­ти­ко­ва­лась про­г­рам­мная эму­ля­ция.

AMD Documents

Примечание 1

В силу конвейерного принципа работы процессора, латентность (Latency) и величина, обратная пропускной спо­соб­но­с­ти (Reciprocal Throughput) не являются тождественными. Например, сочетание параметров Re­ci­pro­cal Throughput = 1, Latency = 3 для заданной инструкции означает, что конвейер способен начать вы­пол­не­ние следующей инструкции в каждом такте, а время ожидания результатов равно 3 тактам. При Reciprocal Through­put = 250, Latency = 280 конвейер способен принять инструкцию на обработку один раз в 250 тактов, а вре­мя обработки составит 280 тактов.

Примечание 2

BMI (Bit Manipulation Instructions) — это набор инструкций, предназначенный для обработки битовых полей, на­при­мер:

  • Инструкция PDEP (Parallel Bits Deposit) размещает набор битов из непрерывного битового поля опе­ран­да-ис­точ­ни­ка в произвольных позициях операнда-приемника, выделенных маской.
  • Инструкция PEXT (Parallel Bits Extract) выбирает из операнда-источника произвольный набор би­тов, за­да­ва­е­мый маской и собирает их в виде непрерывного битового поля в операнде-при­ем­ни­ке.

Tags