12

我很好奇使用 Rosetta 2 与仿真在 Apple M1 平台上运行 x86-64 二进制文件的性能特征截然不同,例如 Docker Desktop 目前使用QEMU所做的事情。

我理解为什么仿真这么慢,但是在这个 Twitter 线程中详细解释了为什么 Rosetta 2 这么快:https ://twitter.com/ErrataRob/status/1331735383193903104

该解释的要点是,在通常情况下,arm 和 x86 具有相反(且不兼容)的内存寻址方案,这需要大量的仿真开销,但 M1 芯片通过硬件优化解决了这个问题,允许它使用两种寻址方案访问内存。实际上,当运行 Rosetta 2 仿真指令时,会设置一个标志以让处理器知道使用 x86 样式的寻址方案。

假设这个解释是合理的(如果有人有比上面的 Twitter 线程更好的来源报告,我会在评论中包含它),从技术上讲,这种优化是否可以用于完整的硬件仿真,例如运行 x86- 64 个 Linux Docker 容器,还是运行一个完整的 x86-64 Windows 桌面虚拟机,比如VMware Fusion/VirtualBox?或者,这些场景中的单独操作系统层是否排除了利用内存排序优化的能力?

另外,此处理器模式(标志或指令)是否已记录并发布以供第 3 方使用,还是仅对 Apple 私有?

4

1 回答 1

5

不是内存寻址,内存排序。即对于用于线程间同步的无锁原子 - 在 x86 中,每个 asm 加载/存储分别是获取/释放。(使用真正的 x86 CPU 进行推测性的早期加载,因此当单个线程在其他线程未写入的内存上运行时,性能在正常情况下不会受到影响。)

M1 具有对此类模式的硬件支持,以及最有效地运行本机 AArch64 代码的弱排序模式。看

是的,https://github.com/saagarjha/TSOEnabler是用于切换该支持的开源软件。但它是一个内核扩展,代码签名使得让 MacOS 允许它变得很棘手,你必须对其签名或禁用签名验证或其他东西:

假设,如果您构建和签署内核扩展(如果您不使用 KEXT 签名证书,则禁用 SIP)并将其拖到 /Library/Extensions 中,您应该能够使用它。应该会出现一个对话框,提示您在“安全和隐私”首选项窗格中启用扩展,您从那里允许它并重新启动,它将被安装。(如果你没有看到它,扩展的权限可能是错误的:试试 chown -R root:wheel。)在实践中,这可能会在很多方面出错,我很幸运通过“重置所有内容”并尝试执行以下操作后安装:

[...] 查看步骤列表的链接


所以是的,QEMU 的 x86 仿真可以使用与 Rosetta-2 的 x86 仿真相同的硬件支持,这似乎是合理的。 它们都是 x86 模拟器。

正如你所说,主要问题是苹果提供了公共 API 来启用硬件模式,因此人们不必手动安装这个内核模块;我敢肯定,大多数人都不想这样做。我对软件情况了解不多,我对 CPU 架构细节更感兴趣。

于 2021-09-04T20:09:16.487 回答