
В условиях, когда x86-совместимые процессоры не только конкурируют между собой, но и должны отстаивать свое право на существование, небольшая и неочевидная архитектурная особенность CPU может стать решающим фактором. Поиск таких неочевидных, но важных новаций давно стал для средств массовой информации чем-то вроде азартной охоты. И, как это бывает, мы узнаем о них не из пресс-релизов, а знакомясь с новыми продуктами. Так произошло и с ноутбуком ASUS ROG Strix GL702ZC, оснащенном процессором AMD Ryzen 7 1700. Речь идет о механизме управления содержимым кэш-памяти, способным оптимизировать ее взаимодействие с оперативным запоминающим устройством (ОЗУ).
Идентификация
Формализуем методы идентификации исследуемого оборудования. Параметру PROCESSOR_IDENTIFIER в рапорте утилиты AIDA64 соответствует значение AMD64 Family 23 Model 1 Stepping 1, AuthenticAMD. Прикладная утилита Java CPUID v0.47, разработанная в нашей тестовой лаборатории, дает следующий результат:
Рис 1. Имя процессора, доступное как текстовая строка посредством функций CPUID 80000002h-80000004h
Примечание. В этом и последующих скрин-шотах утилиты Java CPUID, двоичный файл CPUID.BIN, сохраненный на исследуемой платформе, анализируется на инструментальной платформе.
Рис 2. Параметры процессора: Family 17h, Model 01h
Отметим, в рапорте AIDA64 код модели процессора записан в десятичной системе (23), а утилита Java CPUID визуализировала его как шестнадцатеричное число (17h), как того и требует Advanced Micro Devices.
Рис 3. Список новых инструкций, поддержка которых реализована в AMD CPU семейства 17h.
Фрагмент документа Software Optimization Guide for AMD Family 17h Processors.
Набор поддерживаемых технологий, декларируемый процессором в сеансе операционной системы, может быть сокращен по сравнению с приведенным списком (Рис 3), поскольку зависит как от конкретной модификации процессора, так и особенностей инициализации, выполняемой UEFI-процедурами при старте платформы, включая зависимость от установок опций CMOS Setup. Это означает, что наряду с изучением документации, потребуется эксперимент.
Акцентируем внимание на доступности документов, специально предназначенных для работы с процессорами рассматриваемого семейства. Системным программистам, в частности разработчикам UEFI-приложений и драйверов, адресован Processor Programming Reference (PPR). Разработчикам прикладного ПО, будет полезно руководство Software Optimization Guide (SOG).
Инструкция CLZERO
Описание всех добавленных функциональных расширений (Рис 3) выходит за рамки статьи. Остановимся на одной из новых инструкций: CLZERO. Мнемоника может быть расшифрована как Cache Line Zero и означает обнуление содержимого заданной кэш-строки, идентифицируемой адресом кэшированной области памяти, передаваемым в регистре RAX (в 64-битном режиме) или EAX (в 32-битном). При типовом размере кэш-строки, равном 64 байта, младшие адресные биты 0-5 не используются в силу гранулярности задания диапазона.
Рис 4. Описание инструкции CLZERO в документе AMD64 Architecture Programmers Reference Manual, Volume 3
Во избежание недоразумений, отметим, новая инструкция CLZERO и ранее существующая инструкция CLFLUSH выполняют принципиально различные операции. В первом случае обнуляется содержимое строки (кэшированные данные), а во втором — строка объявляется недостоверной.
Детектирование функциональных расширений
В документации AMD приводится систематизирующая таблица, описывающая методы детектирования опциональных расширений архитектуры.
Рис 5. Фрагмент систематизирующей таблицы из документа AMD64 Architecture Programmers Reference Manual, Volume 3
Наличие инструкции CLZERO индицируется битом [0] регистра EBX после выполнения функции 80000008h инструкции CPUID.
Рис 6. Результат детектирования инструкции CLZERO
Примечание. Количество ядер, равное 16, здесь указано как архитектурный лимит и в общем случае может не соответствовать конфигурации конкретной модели процессора.
Содержимое EBX равно 00000007h, что означает наличие «единиц» в трех младших двоичных разрядах, в том числе бите [0]. Вывод: инструкция CLZERO поддерживается платформой.
В каких случаях это актуально?
Использование инструкции CLZERO создает механизм быстрого обнуления массивов, основанный на обнулении кэшированной копии области DRAM с последующим ее вытеснением из кэш. Также важно, что располагая информацией о том, что 64-байтную область памяти предписано обнулить, процессор может избежать операций пересылки между Cache и DRAM, имеющих место при частичной перезаписи строки.
В каких ситуациях это востребовано?
При выделении памяти пользовательским программам, современные ОС практически всегда должны очищать выделяемый блок. Иной вариант небезопасен, поскольку данные, оставшиеся после приложения, ранее использовавшего память и освободившего ее, станут доступны другим приложениям. Следовательно, от скорости обнуления, в некоторой мере зависит производительность функций ОС API.
Заметим, что пример с инициализацией ОЗУ процедурами POST при старте платформы, был бы не совсем корректен в данном контексте, поскольку в этом случае могут быть использованы более производительные специальные аппаратные средства DRAM-контроллера.