Чтобы оптимизировать выполнение программного обеспечения на оборудовании, анализ задержки инструкций изучает время, необходимое для выполнения низкоуровневых инструкций на процессоре, — либо для оптимизации архитектуры, либо для оптимизации приложений под конкретную архитектуру. Один исследователь в области аппаратного обеспечения, Кристофер Домас (@xoreaxeaxeax на GitHub), применяет другой подход с таблицей лидеров по деоптимизации ЦП (CPU Deoptimization leaderboard), которая направлена не на то, чтобы сделать инструкции на ассемблере максимально быстрыми, а на то, чтобы сделать их максимально медленными и измерить одну инструкцию с самой высокой задержкой.
Победителем здесь стала fxrstor64, выполнение которой заняло 62 секунды, или более 198 миллиардов тактов. Эта инструкция восстанавливает состояние регистров, используемых для SIMD-вычислений, в ячейку памяти размером 512 байт. Чтобы достичь наивысшего (самого медленного) результата, Домас сначала использовал свой собственный инструмент mmiotic для поиска области с высокой задержкой во внутренней структуре PCIe, а затем заставил ЦП загрузить 512-байтовое состояние из MMIO (Memory-Mapped I/O), обрабатывая все эти 512 байт максимально медленно. На это ушло 74 миллиарда тактов, или чуть более 23 секунд.
Затем он пошёл дальше, «истощая шину во время загрузки». Для этого он использовал серию 4-байтовых чтений из другого MMIO-регистра с высокой задержкой, перегружая корневой комплекс PCIe ЦП и вынуждая восстановление состояния вставать в очередь за бесполезными операциями чтения. Следующий шаг — использовать инструкции AMX, доступные в Intel Sapphire Rapids, для xrstore64. Область состояния увеличивается с 512 байт до 8 КБ, что может привести к зависанию инструкции более чем на 1 триллион тактов.
Таблица лидеров x86 доступна на GitHub прямо сейчас, и, похоже, Домас также планирует таблицы для ARM и RISC-V. Для запусков есть несколько правил. Домас говорит, что подойдёт любая конфигурация, при условии, что оценивается выполнение только одной инструкции. Прерываемые инструкции не допускаются, как и оценка эмулированных инструкций, выполняемых в обработчике. Время нормализуется по базовой частоте ЦП, а все платформы запускались без аппаратных модификаций.
Мы имеем дело с кодом на ассемблере, поэтому рейтинг зависит не столько от конкретной инструкции, сколько от того, что вы с этой инструкцией делаете.
Домас в основном использовал два ЦП для тестирования: Intel Core i7-8559U и AMD Ryzen 7 5800H (внутри Trigkey S5). Однако для инструкции rdmsr он использовал чип VIA Eden, который был серией встраиваемых процессоров начала 2000-х. Команда rdmsr используется для чтения модельно-зависимого регистра (MSR). По словам Домаса, VIA «использует недокументированный регистр по адресу 0x133, который даёт чрезвычайно высокое время отклика». Эта команда заняла 202 микросекунды, или 161 602 такта.
Это не первый опыт разработчика с дикими экспериментами с низкоуровневыми инструкциями. Более ранний проект под названием movfuscator — это C-компилятор, который использует исключительно команду mov (перемещение).
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Jake Roach




