Содержание
Самая медленная x86-инструкция в новом рейтинге CPU Deoptimization выполнялась 62 секунды и заняла больше 198 млрд циклов. Проект запустил аппаратный исследователь Christopher Domas, известный на GitHub как xoreaxeaxeax.
Идея звучит как инженерная шутка, но внутри много настоящей низкоуровневой магии. Обычно задержки инструкций измеряют, чтобы ускорять процессоры и код. Domas пошел в обратную сторону: он ищет одиночные инструкции, которые можно заставить работать максимально долго.
fxrstor64 стала лидером «зала позора» x86
Первое место в таблице заняла fxrstor64 — инструкция, которая восстанавливает состояние регистров для SIMD-вычислений из области памяти на 512 байт. В нормальной ситуации такой код не должен занимать минуту, но исследователь специально выбрал самый неприятный путь к этим через медленный MMIO.
Для рекорда Domas использовал собственный инструмент mmiotic. Он помог найти участок с высокой задержкой во внутренней PCIe-инфраструктуре системы. Затем процессор заставили читать 512-байтное состояние из MMIO, то есть из области Memory-Mapped I/O.
Один этот трюк уже дал 74 млрд циклов, или чуть больше 23 секунд выполнения. Потом исследователь добавил нагрузку на PCIe root complex: запустил серию 4-байтных чтений из другого медленного MMIO-регистра. Эти лишние операции забили очередь, и fxrstor64 пришлось ждать.
Финальный результат — больше 198 млрд циклов. Для одной машинной инструкции это почти издевательство над здравым смыслом, но именно в этом смысл эксперимента.
Новые инструкции могут оказаться еще медленнее
Следующая цель проекта связана с AMX-инструкциями в серверных Intel Sapphire Rapids. У них область состояния вырастает с 512 байт до 8 КБ, поэтому похожий сценарий с xrstor64 может упереться уже не в десятки миллиардов, а в значение больше 1 трлн циклов.
Это хороший напоминатель о том, что «продвинутый набор инструкций» не всегда означает быстрый код в любом контексте. В реальных приложениях такие крайности почти не встречаются. Но на уровне архитектуры видно, как дорого может стоить доступ к медленным устройствам через память.
Сам рейтинг Domas ведет на GitHub: x86 leaderboard уже открыт. В планах у исследователя — отдельные таблицы для ARM и RISC-V. Если они появятся, сравнение получится особенно вкусным для тех, кто спорит про «чистоту» архитектур.
Правила рейтинга и странный рекорд VIA Eden
В CPU Deoptimization считают только время выполнения одной инструкции, без аппаратных модификаций платформы. Результаты нормализуют по базовой частоте CPU, прерываемые инструкции не принимают, а эмуляцию через обработчик нельзя выдавать за настоящий запуск.
Основные тесты Domas проводил на Intel Core i7-8559U и AMD Ryzen 7 5800H в мини-ПК Trigkey S5. Для инструкции rdmsr он взял VIA Eden — семейство встраиваемых процессоров начала 2000-х.
Rdmsr читает model-specific register, или MSR. В случае VIA Eden исследователь нашел недокументированный регистр по адресу 0x133, который отвечал с огромной задержкой. Команда заняла 202 мкс, или 161 602 цикла.
У Domas уже был проект из той же оперы — movfuscator, C-компилятор, который генерирует код только через инструкцию mov. В CPU Deoptimization действует другое жесткое ограничение: в зачет идет выполнение одной инструкции, а прерываемые инструкции и обработчики эмуляции правила рейтинга прямо запрещают.