ARM 跑 x86 程序性能暴跌近 10 倍!问题不在指令翻译,而是内存序鸿沟
很多人以为,ARM 模拟运行 x86 软件卡顿,根源是 CISC 指令解码、JIT 编译效率低。但 FEX 模拟器最新技术文章揭开真相:真正的性能杀手,是 x86 与 ARM 两套完全不一样的内存序模型。
x86 采用 TSO 全存储排序,写内存对所有核心立刻可见,读不能越过前面写操作,对多线程开发者很友好,但限制硬件乱序优化。
ARM 是弱内存序,允许处理器重排访存指令,换取更高性能与能效。想要在 ARM 上严谨模拟 x86‑TSO,就得大量插入昂贵的同步屏障指令,直接堵死 CPU 流水线。在游戏重度矢量负载场景,性能最多直接跌近10倍。
为了能跑起来,各类模拟器只能做妥协:
✅苹果 Rosetta2 最讨巧,芯片内置硬件寄存器,可以一键切换硬件 TSO 模式。就算硬件兜底,M1 Ultra 实测依旧有约 8.94% 性能损耗,极端场景开销翻倍,但远好于纯软件模拟。
🟡开源社区左右为难:QEMU 坚守正确性,性能拉胯;Box64 默认直接关掉内存序模拟换取速度,程序容易随机崩溃;FEX 则在稳定和帧率之间反复权衡。为了流畅,不少模拟器默认关闭完整 TSO 模拟,代价是多线程程序出现随机死机、数据撕裂的隐性 BUG,属于 “能用但埋雷”。
还有一个终极难题:跨缓存行原子锁 split‑lock。x86 硬件原生处理非对齐跨缓存行原子操作;ARM 硬件只支持 16 字节以内非对齐原子,一旦跨过缓存行边界,就会触发异常,只能靠极慢的软件 CAS 循环模拟,就连苹果硬件 TSO 也解决不了这个痛点。
现在高通、Valve 等厂商,正在从 CPU 微架构、Linux 内核层面打补丁缓解问题,但想要彻底根治,还需要 ARM 架构新增对应的硬件指令支持。
说白了,跨架构模拟最难的不是翻译一条条指令,而是替老旧 x86 代码,实现 ARM 硬件本不存在的底层契约。
你平时用 ARM 设备跑 x86 软件、模拟器游戏时,遇到过莫名闪退、随机卡死的情况吗?
|
|
|
|
|
|
|