AMD EPYC 7452 в контексте CPUID: персистентность на пороге?

Презентация EPYC Rome, раз­ра­бо­тан­но­го с ис­поль­зо­ва­ни­ем ар­хи­тек­ту­ры Zen 2, от­кры­ва­ет путь к на­тур­ным экс­пе­ри­мен­там с но­вин­кой от AMD. В на­шем рас­по­ря­же­нии ока­зал­ся ин­же­нер­ный об­ра­зец 32-х ядер­но­го про­цес­со­ра AMD EPYC 7452 в кон­струк­ти­ве Socket SP3, ис­сле­до­ва­ние внут­рен­них струк­тур ко­то­ро­го да­ет воз­мож­ность уз­нать, ка­ки­ми ар­гу­мен­та­ми ком­па­ния AMD хо­чет убе­дить сер­вер­ный ры­нок в сво­их ли­дер­ских спо­соб­но­с­тях.

AMD EPYC 7452 в контексте CPUID: персистентность на пороге?

В системной информации, доступной с помощью Java-инструментария CPUID (а потому способного вы­пол­нять свои фун­к­ции в среде большинства опе­ра­ци­он­ных систем), на первый план выступает под­держ­ка ин­ст­рук­ций управления кэш-памятью, оп­ти­ми­зи­ро­ван­ных для опе­ра­ций с персистентными регионами па­мя­ти — CLWB и WBNOINVD.

Процессор AMD EPYC 7452 глазами утилиты Java CPUID v0.72

Процессор AMD EPYC 7452 глазами утилиты Java CPUID v0.72

О кэшировании энергонезависимой памяти

Появление NVDIMM, а также приобретение NVMe-накопителями способности прямо отображать пер­сис­тен­т­ные ди­а­па­зо­ны па­мя­ти в адресное пространство, стало маленьким шагом на долгом пути ни­ве­ли­ро­ва­ния раз­ли­чий между опе­ра­тив­ной па­мя­тью и уст­рой­ст­ва­ми хранения. Речь о фун­к­ци­о­наль­но­с­ти PMR (Persistent Memory Region), по­лу­чив­шей офи­ци­аль­ный статус в спе­ци­фи­ка­ции NVMe 1.4 от 10 июня 2019 года.

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

Функция CPUID 80000008h декларирует поддержку процессором инструкции WBNOINVD (Writeback no invalidate)

Функция CPUID 80000008h декларирует поддержку процессором инструкции WBNOINVD (Writeback no invalidate)

Классическая инструкция WBINVD (Write­back and Invalidate) далека от решения означеной выше про­б­ле­мы — она вы­гру­жа­ет содержимое кэш, ожи­да­ю­щее от­ло­жен­ной записи, и объявляет кэш-память не­до­сто­вер­ной. Это не­же­ла­тель­ный по­боч­ный эф­фект в ситуации, когда кэшированная ин­фор­ма­ция вско­ре по­тре­бу­ет­ся при­ло­же­нию.

Новая инструкция WBNOINVD (Writeback and No Invalidate) преследует благую цель — вы­гру­зить ин­фор­ма­цию из кэш-памяти про­цес­со­ра в пер­сис­тен­т­ный носитель, не удаляя эту информацию из кэш-памяти. Обе инструкции WBINVD и WBNOINVD не только га­ран­ти­ру­ют ко­ге­рен­т­ность про­цес­сор­ной кэш-памяти, но и фор­ми­ру­ют спе­ци­аль­ное со­об­ще­ние для системной ло­ги­ки, форсирующее сохранение внешних по от­но­ше­нию к про­цес­со­ру уровней кэш. Полномочия для ис­поль­зо­ва­ния этих «тя­же­ло­вес­ных» кон­ст­рук­ций являются при­ви­ле­ги­ей только опе­ра­ци­он­ной сис­те­мы и не­до­ступ­ны при­клад­но­му про­грам­мис­ту.

О достоверности отложенной записи строк

Инструкция CLWB (Cache Line Writeback) оптимизирована для со­гла­со­ва­ния со­дер­жи­мо­го кэш-памяти и пер­сис­тен­т­но­го за­по­ми­на­ю­ще­го уст­рой­ст­ва на уровне от­дель­ных кэш-строк. Если ячейка памяти, адрес которой определяется операндом ин­ст­рук­ции CLWB, со­дер­жит­ся в кэш и ожидает отложенной записи, то операция записи форсируется. Так до­сти­га­ет­ся га­ран­ти­ро­ван­ное об­нов­ле­ние информации в персистентном носителе, сан­к­ци­о­ни­ро­ван­ное про­грам­мным обес­пе­че­ни­ем.

Функция CPUID 00000007h декларирует поддержку процессором инструкции CLWB (Cache Line Writeback)

Функция CPUID 00000007h декларирует поддержку процессором инструкции CLWB (Cache Line Writeback)

В отличие от функционально сходной ин­ст­рук­ции CLFLUSH (Cache Line Flush), ин­фор­ма­ция не удаляется из кэш-памяти. В случаях, если сценарий работы при­ло­же­ния пред­у­смат­ри­ва­ет по­сле­ду­ю­щий доступ к этой информации, та­кое раз­ли­чие между ин­ст­рук­ци­я­ми CLWB и CLFLUSH оказывает су­ще­ст­вен­ное влияние на про­из­во­ди­тель­ность.

Инструкция CLWB (Cache Line Writeback), управляющая сохранением заданной стро­ки кэш-памяти, может применяться на лю­бом уров­не при­ви­ле­гий, в том числе в поль­зо­ва­тель­ских при­ло­же­ни­ях.

Что в итоге?

В условиях, когда ни твер­до­тель­ные на­ко­пи­те­ли, ни операционные системы тол­ком не готовы под­дер­жать идею пер­сис­тен­т­нос­ти, AMD следует неуклонным курсом на построение эф­фек­тив­ных ге­те­ро­ген­ных сис­тем с мак­си­маль­ным ни­ве­ли­ро­ва­ни­ем раз­ли­чий в под­клю­че­нии ком­по­нен­тов. Будет ли платформа на EPYC Rome го­то­ва ре­аль­но вклю­чить в свое ад­рес­ное про­ст­ран­ст­во и энер­го­не­за­ви­си­мые уст­рой­ст­ва, сегодня прогнозировать не возьмется никто. Тем не менее, AMD пред­ус­ма­т­ри­ва­ет и такой сценарий.