Windows 11 Prism: перевод x86 в Arm-код удваивает число инструкций

Windows 11 Prism: перевод x86 в Arm-код удваивает число инструкций

ПК-рынок труден для новых архитектур: пользователи ждут, что любая программа просто запустится, а софт для Windows десятилетиями пишется под x86-64. Современные 64-битные ядра Arm от Qualcomm уже достаточно быстры, но шансы Arm на массовом ПК-рынке упираются в то, насколько гладко Microsoft умеет запускать x86-64-программы на aarch64-железе. Для этого в Windows 11 встроен транслятор Prism, который на лету переводит x86-64-инструкции в aarch64.

Издание Chips and Cheese измерило штраф от такой трансляции с помощью Geekbench 7, который существует в отдельных версиях под aarch64 и под x86-64: нативный прогон сравнили с x86-64-версией, запущенной через Prism. Тестовое железо, ноутбук Asus Zenbook A16 на Snapdragon X2 Elite Extreme X2E-96-100 (предоставлен Asus), а также инстансы на ядрах Arm Neoverse N1 и N2 в Microsoft Azure. Джон Пул, основатель Primate Labs и создатель Geekbench, предоставил изданию pro-ключ, который открывает профилирование отдельных подтестов.

Главный результат по числу инструкций: как правило, при трансляции через Prism ворклоад Geekbench 7 выполняет примерно вдвое больше aarch64-инструкций, чем исходных x86-64, исключение составил только тест PDF Viewer. По итоговым баллам штраф ещё жёстче: каждое протестированное ядро, включая ядра Qualcomm, теряет производительность на несколько поколений вперёд. У Snapdragon X2 Elite два типа ядер: кластер из 6 «производительных» ядер (Performance, 6-wide, 3,6 ГГц) и два кластера по 6 «топовых» ядер (Prime, 9-wide, 5 ГГц). Даже с учётом штрафа от трансляции «производительные» ядра Qualcomm обгоняют более старое Neoverse N1, а «топовые», Neoverse N2: у широких ядер с высокой тактовой частотой запас прочности оказывается больше штрафа.

Ядра Qualcomm несут и чуть меньший относительный штраф от трансляции, чем ядра Neoverse, но автор не берётся сказать, чем это объясняется, специфической настройкой Prism под Snapdragon или просто более высокой пропускной способностью самих ядер. Prism официально оптимизирован и настроен именно под процессоры Qualcomm Snapdragon: часть его функций производительности требует аппаратных возможностей, доступных только в линейке Snapdragon X, хотя сам транслятор работает на любых поддерживаемых устройствах Windows 11 on Arm с версией Windows 11 24H2. При этом по числу выполняемых инструкций разница между ядрами Qualcomm и старейшим в выборке Ampere Altra (Neoverse N1) минимальна, счётчики показывают сопоставимые значения.

Прирост инструкций от трансляции лишь отчасти компенсируется приростом IPC (инструкций за такт): у Qualcomm он есть, но заметно уступает по масштабу самому приросту числа инструкций, этим и объясняется большой итоговый штраф к баллам. Разные подтесты страдают неодинаково: Navigation, где производительность упирается в предсказание переходов и задержки памяти, теряет сравнительно немного, а векторизованный, использующий AVX-инструкции Video Player, очень сильно; похожая картина у Photo Editor и Photo Library. На Neoverse N1 и N2 характер нагрузки под трансляцией почти не меняется.

Neoverse N2 не может разогнаться выше 3 IPC ни в одном подтесте, ни нативно, ни под трансляцией, и почти не получает прироста IPC от лишней ширины ядра при трансляции. Neoverse N1, самое старое ядро в выборке, страдает сильнее всех: у него меньше окно внеочередного исполнения (out-of-order) и задержка промаха в L2 превышает 100 тактов. Ядро Qualcomm E-Core той же ширины, что у N1, но спроектировано держать в полёте более чем вдвое больше инструкций одновременно, поэтому оно заметно лучше поглощает лишнюю нагрузку от трансляции. У самого Qualcomm E-Core (4-wide) относительный штраф от трансляции ниже, чем у более широкого Neoverse N2 (5-wide), уже, а не шире, ядро Qualcomm легче "прокормить" данными, к тому же у его кластера 12 МБ L2 с задержкой 21 такт против 1 МБ L2 у Neoverse N2, после промаха которого приходится идти в L3 с задержкой около 100 тактов.

Prism хранит переведённый код на диске в каталоге C:\Windows\XtaCache, это экономит время на повторной трансляции при следующих запусках той же программы и в теории позволяет заглянуть внутрь и понять, как именно x86-64-код превращается в aarch64. На практике этим неудобно пользоваться: Microsoft так и не задокументировала формат кэш-файлов .jc, и разобраться в нём смогли только сторонние энтузиасты. В качестве примера автор разбирает ворклоад Video Player, он выделяется одновременно и сильным ростом IPC под трансляцией, и огромным ростом числа инструкций; профилирование этого же теста на процессоре Skylake с помощью Intel VTune показывает, что самый "горячий" базовый блок кода, это цикл из 17 инструкций (на этом месте доступный фрагмент материала обрывается, дальнейший разбор цикла в исходном тексте не приведён).

Ключевые факты

  • Windows 11 использует транслятор Prism, чтобы запускать x86-64-программы на aarch64-процессорах; от него зависит, приживётся ли Arm на массовом ПК-рынке, где софт традиционно пишется под x86-64.
  • Chips and Cheese сравнила нативный aarch64- и переведённый через Prism x86-64-прогон Geekbench 7 на Snapdragon X2 Elite Extreme (ноутбук Asus Zenbook A16) и на Arm Neoverse N1/N2 в Azure.
  • Трансляция примерно удваивает число выполняемых инструкций почти во всех подтестах (кроме PDF Viewer) и оборачивается штрафом к баллам «на несколько поколений вперёд» для любого протестированного ядра.
  • Из-за высокой тактовой частоты и ширины ядер Snapdragon X2 Elite обгоняет более старые Neoverse N1/N2 даже с учётом штрафа от трансляции; сильнее всего под трансляцией страдают векторизованные AVX-нагрузки вроде Video Player.
  • Переведённый код Prism кэширует в C:\Windows\XtaCache, но формат кэш-файлов .jc Microsoft официально так и не задокументировала.

Почему это важно

Судьба Arm на рынке настольных ПК и ноутбуков решается не столько скоростью самих чипов, современные ядра Qualcomm уже достаточно быстрые, сколько тем, насколько гладко на них запускается унаследованный x86-64-софт, который разработчики портируют на aarch64 медленно и не всегда вообще. Prism, это ставка Microsoft на то, что программную несовместимость можно закрыть трансляцией "на лету", а не ждать десятилетия, пока весь рынок перепишет код под новую архитектуру. Материал с цифрами показывает, во что реально обходится эта ставка: не в разы, а кратно, по числу инструкций и по итоговому баллу производительности.

Кому это важно

Инженерам и архитекторам, которые проектируют или выбирают Arm-чипы для ноутбуков (в первую очередь Qualcomm и её конкурентам), и разработчикам софта, которые решают, стоит ли делать отдельную aarch64-сборку своей программы или полагаться на трансляцию. Косвенно, покупателям Windows-ноутбуков на Snapdragon, которым важно понимать, что нативная aarch64-версия программы всегда будет ощутимо быстрее той же программы под Prism.

Как это применить

Практический вывод: если приложение активно использует векторные инструкции (AVX и подобные), перевод через Prism ударит по его скорости особенно сильно, таким программам нативный aarch64-порт нужен в первую очередь. Для менее требовательных к вычислениям сценариев (навигация, обычная офисная работа) штраф от трансляции меньше, и мощные ядра вроде Snapdragon X2 Elite всё равно могут обгонять старые нативные aarch64-чипы даже под трансляцией, но это не повод отказываться от нативной версии там, где она доступна.

Можно ли доверять

Источник, Chips and Cheese, издание, специализирующееся на низкоуровневом анализе процессорных архитектур. Тестирование опирается на официальный инструмент (Geekbench 7 с pro-ключом, лично предоставленным Джоном Пулом, основателем Primate Labs) и на данные аппаратных счётчиков производительности с нескольких реальных платформ, ноутбука на Snapdragon X2 Elite Extreme и облачных инстансов Azure на Neoverse N1/N2. Слабое место методологии заявлено самим автором: один бенчмарк-пакет не может отражать поведение всех возможных приложений, это лишь отправная точка. Доступный фрагмент текста обрывается до финального вывода автора.

Риски и подводные камни

Автор сам отмечает нестыковку в данных: счётчики Qualcomm показывают более высокое число выполненных инструкций, чем у Neoverse N1/N2 на многих тестах, что может говорить о неточности аппаратного мониторинга производительности, а не о реальной разнице в нагрузке. Часть возможностей Prism, повышающих производительность, требует аппаратных функций, доступных только в линейке Snapdragon X, на других aarch64-чипах для Windows 11 on Arm транслятор может работать медленнее. Наконец, недокументированный Microsoft формат кэша .jc ограничивает независимую проверку того, как именно происходит трансляция.

«Как правило, при трансляции через Prism ворклоад Geekbench 7 выполняет примерно вдвое больше aarch64-инструкций, чем исходных x86-64-инструкций.»

— Chips and Cheese