Є багато речей, які ми припускаємо, щоб спростити життя. Наприклад, дроти не мають опору або інших дивних ефектів. Кристалічні осцилятори випромінюють свою точну частоту. Але напевно наша модель того, як комп’ютер зберігає та завантажує пам’ять, є точною, чи не так? Ви розміщуєте дані в певному місці, а потім видаляєте їх. в [FEX-Emu] Розробники мають іншу точку зору. Це не так просто, якщо у вас є кеш-пам’ять і, можливо, кілька ЦП.
Основна проблема: якщо один ЦП (або, точніше, головний шина) записує в розташування, чи має інший ЦП доступ до нового значення? Загальна модель упорядкування пам’яті X86 дає програмістам сильні гарантії щодо того, коли завантаження та сховища є видимими, тоді як ARM навмисно використовує слабшу модель пам’яті, яка вимагає значно більшого упорядкування для продуктивності та ефективності упорядкування.
Теоретично емулятор міг би це компенсувати, перевівши прості операції пам’яті x86 в операції вибірки/вибору ARM, але робити це для майже кожного посилання на пам’ять може бути дорогим. Нові розширення ARM, такі як LRCPC, значно допомагають, тоді як Apple застосувала більш прямий підхід, додавши в Apple Silicon режим TSO, сумісний із x86. Це дозволяє користувацьким завантаженням і збереженням працювати так, як очікується від перекладеного коду x86 за відносно низькою ціною.
З непослідовним доступом і атомарними операціями все стає набагато поганіше. Програмне забезпечення X86 регулярно виконує доступи, для яких ARM погано підходить, а x86 забезпечує дивовижні атомарні гарантії в межах лінії кешу. FEX іноді доводиться виловлювати помилки синхронізації та динамічно виправляти перекладений код із перешкодами. Дискретні операції ще гірші: деякі вимагають екскурсії через ядро та сигнальні процесори, і можуть бути в сотні чи тисячі разів повільнішими, ніж зазвичай. Нові ядра Oryon від Qualcomm покращують ситуацію, підтримуючи синхронізовані атоми кешу, тоді як Valve оптимізує ядро Linux, яке безпосередньо обробляє деякі несумісні атоми.
Є ще один особливо поганий куток, пов’язаний із записом пам’яті GPU. Комп’ютерні ігри часто очікують спеціальної семантики x86 під час запису в некешовані буфери, призначені для дискретних графічних процесорів. ARM наразі не має чистого еквівалента для деяких із цих магазинів, і FEX вимірює пропускну здатність у найгіршому випадку більш ніж у 800 разів повільніше, зменшуючи деякі ігри до рівня менше 1 FPS. Системи UMA працюють набагато краще, оскільки драйвери часто можуть замінити просту кеш-пам’ять.
Це довга стаття, але це гарна ілюстрація того, чому сучасні емулятори не стільки займаються перекладом інструкцій, скільки переглядають десятиліття архітектурних припущень, від яких тихо залежить програмне забезпечення. Звичайно, не всі емулятори чи відтворення процесора настільки точні, і часто цього достатньо. Але інколи вам потрібна розвага, яка справді відповідає епосі та веде себе так само, як оригінал.