По словам разработчиков FEX-Emu, эмулировать модель работы компьютерной памяти гораздо сложнее, чем кажется, когда в работу вовлекаются кэши и несколько процессоров. Модель Total Store Ordering в x86 обеспечивает сильные гарантии видимости операций с памятью, тогда как более слабая модель ARM разрешает переупорядочивание ради производительности. Хотя эмуляторы могут компенсировать это с помощью операций acquire/release, затраты возрастают; расширения LRCPC и совместимый с x86 режим TSO в Apple Silicon снижают нагрузку.
Проблему усугубляют невыровненные доступы и атомарные операции. FEX может обнаруживать ошибки выравнивания и добавлять барьеры в транслированный код; операции split-lock при этом могут выполняться в сотни или тысячи раз медленнее обычного, обращаясь к ядру и обработчикам сигналов. Ядра Oryon от Qualcomm и оптимизация Linux от Valve позволяют уменьшить некоторые проблемы.
В памяти write-combined, используемой для записи на GPU, эквиваленты ARM оказываются недостаточными; в худшем случае пропускная способность падает в 800×, из-за чего игры могут работать со скоростью менее 1 FPS. Системы UMA демонстрируют лучшие результаты. Эмуляция заключается не столько в переводе инструкций, сколько в воспроизведении архитектурных предположений.
Почему это важно
Это техническое различие затрудняет одновременное сохранение совместимости и производительности в эмуляторах, запускающих программное обеспечение x86 на оборудовании на базе ARM. Поскольку проблема не ограничивается переводом инструкций процессора, использование нескольких ядер, атомарные операции и доступ к памяти GPU могут давать разные результаты на разном оборудовании. Поэтому результаты начинают зависеть не только от используемых процессора и архитектуры памяти, но и от того, какие оптимизации применяют операционная система и эмулятор; Apple Silicon, Oryon, оптимизации Valve и архитектуры UMA показывают, что это различие можно уменьшить. Открытым остается вопрос о том, для каких рабочих нагрузок этих улучшений будет достаточно и в какой степени можно будет поддерживать дополнительные издержки, необходимые для совместимости.