← На главную

Assembly Hall of Shame: fxrstor64 заняла 62 секунды — самая медленная

07.08.2026 18:01 · hackernews

Проект Assembly Hall of Shame ищет не самый быстрый, а самый медленный способ выполнить одну инструкцию. Рекордсмен — fxrstor64 на AMD Ryzen 7 5800H. Инструкция загружает 512-байтное состояние FPU/MMX/XMM из MMIO-области PCIe. Чтобы замедлить её ещё сильнее, автор запустил на других ядрах «молот»: они читают другой MMIO-регистр короткими 4-байтными транзакциями. Это насыщает PCIe root complex и endpoint non-posted транзакциями, и загрузка 512 байт выстраивается в очередь за всем этим трафиком. Итог — 198 002 498 236 циклов, или 62 секунды.

На другом конце шкалы — обычный nop: 1 цикл. Удлинённый nop (data16 data16 … nopl) — 20 циклов. Базовая инструкция для ориентира — 49 циклов. Дальше идут более интересные случаи: idivq с 128-битным делимым и маленьким делителем — 77 циклов; enter с максимальной глубиной вложенности 31 — 112 циклов; небольшая денормаль для FPU assist — 133 цикла; clflush по грязной строке кэша — 165; fsin с QNaN — 257; mfence после насыщения write-combining буферов через movnti — 326. На AMD Ryzen invlpg — 352 цикла. fadd с денормалью — 677. lock xadd, операнд которого пересекает границу кэш-линии, — 865. fdiv с субнормальным делителем — 883. CPUID — 1248. rdrand в цикле, исчерпывающий аппаратный энтропийный пул, — 5579 циклов. wrmsr к MCG_CTL на Zen — 34 304. outl к регистру NIC, вызывающий остановку TX DMA — 49 857. Незадокументированный MSR 0x133 на VIA Eden даёт 161 602 цикла. Заполнение всех уровней кэша грязными строками — 1 616 480. inl из ACPI PM порта — 12 524 415.

Дальше начинается работа с MMIO. Поиск медленных регистров PCIe дал vmovdqu из GPU-регистра: 32-байтное невыровненное чтение занимает 4,45 миллиарда циклов. Но ещё медленнее — fxrstor64 из MMIO: базовый вариант — 74,58 миллиарда. А с «молотом» по соседнему регистру — 198 миллиардов. В планах — xrstor64 на Sapphire Rapids с расширенным AVX-состоянием: область 8 КБ вместо 512 байт, ожидается около триллиона циклов.

Правила челленджа: засчитывается только одна инструкция (подготовка не считается), запрещены rep/pause и прерываемые инструкции, платформы только в заводском состоянии, время нормируется по базовой частоте. Проект ведёт Christopher Domas (@xoreaxeaxeax).

Читать оригинал →