Исследователь создал таблицу лидеров самых медленных инструкций x86 – рекорд 198 миллиардов циклов за 62 секунды

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

Исследователь железа Кристофер Домас (известный как @xoreaxeaxeax на GitHub) пошёл в противоположном направлении. Его проект CPU Deoptimization ищет не самое быстрое, а самое медленное исполнение одной инструкции ассемблера.

Победителем стала инструкция fxrstor64, которой потребовалось 62 секунды, или более 198 миллиардов циклов, чтобы завершиться. Эта команда восстанавливает состояние регистров, используемых для SIMD-вычислений, из области памяти размером 512 байт.

Чтобы добиться максимально медленного результата, Домас сначала применил собственный инструмент mmiotic для поиска области с высокой задержкой во внутренней шине PCIe.

Затем он заставил процессор загрузить состояние в 512 байт из MMIO (Memory-Mapped I/O), обрабатывая каждый из этих байтов как можно медленнее. На это ушло 74 миллиарда циклов, чуть больше 23 секунд.

После этого исследователь пошёл дальше, "истощая шину, пока идёт загрузка". Он использовал серию 4-байтовых чтений из другого MMIO-регистра с высокой задержкой, перегружая корневой комплекс PCIe процессора и вынуждая восстановление состояния встать в очередь за бесполезными операциями чтения.

Следующий шаг заключается в применении инструкций AMX, доступных в интеловской архитектуре 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 (перемещение).

Больше статей на Shazoo
Тэги:

Об авторе

Эксперт по Fallout
Главный редактор
Более 16 лет в индустрии освещения видеоигр, кино, сериалов, науки и техники. Особенно разбираюсь в серии Fallout, ценитель The Elder Scrolls. Поклонник Arcanum и Fallout Tactics. Больше всего играю в Civilization, Old World и градостроители. Изучаю ИИ и загадки космоса.