为什么在将x86翻译为M1时,QEMU的性能远远达不到Rosetta 2的水平?

15

显然,QEMU 是唯一能在新的 Apple silicon(M1、M2 等)上模拟 x86 操作系统的开源代码。

Apple 构建了 Rosetta 2,在理论上,它做的与 QEMU 在这些情况下所做的完全相同。它将 x86(英特尔)指令转换为新的 Apple silicon 处理器所支持的指令集。

Rosetta 2 表现出了卓越的性能,甚至有些 x86 应用程序在本机 x86 硬件上运行时性能更好。另一方面,当在 Apple Silicon 上运行 x86 Linux 时,QEMU 却并不接近。

那么 Rosetta 如何有如此优异的性能呢?是否有仅 Apple 知道的关于他们体系结构的“秘密”,从未分享给 QEMU 项目?QEMU 不允许访问任何被禁止的 API 吗?


Qemu是一个解释器。Rosetta是一个Jit重新编译器。 - undefined
2个回答

16
Rosetta和QEMU都是模拟器。然而,它们以截然不同的方式解决问题。
QEMU
为了模拟Linux系统,QEMU还必须模拟存储设备、控制台输出设备、以太网设备、键盘和整个CPU。在这个框架下,它通过即时翻译来模拟每一条指令。从Linux内核到/bin/ls命令,它都可以模拟。
QEMU的Intel模拟一般没有太多限制。您可以运行大多数Intel操作系统和相关应用程序。
Rosetta 2
另一方面,苹果的模拟是在应用程序启动之前进行的。整个二进制文件从x86翻译成Apple Silicon并启动。一旦翻译完成,应用程序实际上就成为了本地的arm64二进制文件,可以进行本地的macOS系统调用。
苹果的文档解释如下:
如果一个可执行文件只包含Intel指令,macOS会自动启动Rosetta并开始翻译过程。翻译完成后,系统会启动翻译后的可执行文件来替代原始文件。然而,翻译过程需要时间,因此用户可能会感觉到翻译后的应用程序在某些时候启动或运行较慢。
此外,苹果芯片还有一个选项,可以运行从英特尔转换而来的代码,使用与英特尔相同的内存排序方式:
4/ 所以苹果简单地作弊了。他们在他们的CPU中添加了英特尔的内存排序。在运行转换后的x86代码时,他们将CPU的模式切换为符合英特尔的内存排序。 — Robᵉʳᵗ Graham, 挑衅者 (@ErrataRob) 2020年11月25日 Rosetta 2有一些重要的限制。例如,您不能使用英特尔内核扩展、虚拟化x86_64计算平台的虚拟机应用程序(例如Parallels),也不能使用AVX/AVX2/AVX512向量指令。

2
我认为现有的答案忽略了罗塞塔“神奇”性能中一个相当重要的方面。
x86比arm64具有更强的内存排序。
罗塞塔能够将x86机器码翻译成高效的arm64,这在很大程度上得益于苹果Silicon实现的arm64中增加了强大的内存排序模式。任何其他试图将x86翻译成arm64的仿真器或平台都必须在各个地方插入内存屏障,以确保在翻译成arm64代码时对x86的假设成立。但是,有了苹果Silicon,罗塞塔可以轻松地“翻转开关”,在运行从x86翻译而来的代码时启用这些更强的内存约束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接