x86 通过 Rosetta 2 转译为 ARM 指令,会不会出现 ARM 中找不到对应的指令的情况?

2020-12-25 22:58:07 +08:00
 liudaqi
x86 指令集也有几代的版本(最新版大约有 100 多条指令),ARM 同样也发展了好几代指令集版本( v8 版也有上百条指令),x86 -> ARM 都能找到一一对应的转译指令吗?会不会出现 ARM 中找不到对应的 x86 指令的情况?

(当然,以苹果的实力,真找不到 ARM 架构中完全对应的指令,自己魔改增 /删 ARM 公版指令集也是可以的,不知道 M1 有没有动手术到这个层面?)
3172 次点击
所在节点    macOS
18 条回复
bnrwnjyw
2020-12-25 23:12:21 +08:00
复杂指令总是能用简单指令代替的,也不可能完全一对一。几条加减法指令能创造出无穷的运算。
des
2020-12-25 23:21:34 +08:00
并不是所有指令集都能那么容易替代的,比如 AVX 指令,Rosetta 2 目前还不能支持
systemcall
2020-12-25 23:43:29 +08:00
除了指令,还有寄存器
jvm 的指令,一般的 CPU 也不是都有吧
转译不是那个意思吧。又不是同架构的 hypervisor
BrettD
2020-12-25 23:45:19 +08:00
ARM 没有自带那个指令也可以软件层面模拟
lcdtyph
2020-12-25 23:50:38 +08:00
有没有特殊指令不知道,但是苹果肯定是在 M1 硬件里对 x86 的内存模型进行特别支持了
love
2020-12-26 00:27:26 +08:00
都是图灵完备的,可以效率低没有不能转的
wdlth
2020-12-26 00:47:24 +08:00
很多 SIMD 指令集是可以相互转换的,可以看看这个项目:
https://github.com/simd-everywhere/simde
LukeChien
2020-12-26 00:55:25 +08:00
也不一定全转换吧,x86 也是有兼容逻辑的,例如 AVX2 也并不是所有都支持,转换最低可用版本或者一条转多条
loading
2020-12-26 01:40:45 +08:00
说到底还是晶体管,只要最简单的汇编能写出来就能兼容,除非(遇事不决)量子力学。
YuiTH
2020-12-26 02:07:48 +08:00
一个简单的事实:不是每个 x86 芯片都支持每条 x86 指令的。比如桌面 U 基本都不支持至强才有的 AVX512 。
所以就很简单了,Windows 是要保证兼容性的,大多数软件也没弱智到只适配某一个 CPU (有的话在大多数的 X86 兼容机上也无法运行),那么 M1 只要转译一个够常用的,对本代或者前几代桌面 x86 基本覆盖的现代指令集就好了。
lewis89
2020-12-26 02:08:17 +08:00
@loading #9 老点的 mips 路由器连浮点都没有 都是 Linux 下用 libc 模拟的
lewis89
2020-12-26 02:09:11 +08:00
@YuiTH #10 你说这个,就让我想起了多年前图拉丁的游戏指令集的梗
loading
2020-12-26 08:06:37 +08:00
@lewis89 我大学用汇编就写过计算器了,连乘法器都没有的单片机,所以你说的 libc 模拟我都不需要。
blackcatxh
2020-12-26 12:55:09 +08:00
Rosetta can translate most Intel-based apps, including apps that contain just-in-time (JIT) compilers. However, Rosetta doesn’t translate the following executables:

- Kernel extensions
- Virtual Machine apps that virtualize x86_64 computer platforms

Rosetta translates all x86_64 instructions, but it doesn’t support the execution of some newer instruction sets and processor features, such as AVX, AVX2, and AVX512 vector instructions. If you include these newer instructions in your code, execute them only after verifying that they are available. For example, to determine if AVX512 vector instructions are available, use the “sysctlbyname” function to check the hw.optional.avx512f attribute.
CismonX
2020-12-26 13:11:19 +08:00
@YuiTH #10 从十代开始,基本上都支持 AVX512 了

在这之前有 i3-8121U,相当低端的移动端 U,两年前 Intel 刚开始试水 10nm 的时候搞的,体质差到核显都不得不屏蔽掉,但是它支持 AVX512 。。
YuiTH
2020-12-26 13:52:45 +08:00
@CismonX 我隐约记得有这么个事,所以加了一些“大概” “基本”的词保证严谨。
anyway,重要的核心观点不影响,绝大多数系统和软件都是会根据所处的平台决定执行的代码的。如果观察过./configure 一类的配置过程的话,就会发现里面在检查大量库与指令集的兼容性,都是为了保证兼容性。不然只能在十代跑岂不是还不如 M1 了。
CismonX
2020-12-26 14:52:50 +08:00
@YuiTH #16

嗯,我做过 SIMD 开发。一般来说向用户直接分发二进制的程序,为了兼容性,都有运行期检测 CPUID 的操作

只需要分发源码的时候,会有诸如 #ifdef __AVX512F__ 这种操作,这种情况对于 Rosetta 来说是一种挑战,需要它对各种扩展指令集做模拟。这件事情 Intel SDE 很多年前就在做了,可以在几乎任何自家 CPU 上模拟扩展指令集

当然,即使 Rosetta 不支持也没有问题,因为用户可以重新编译。。
wanguorui123
2020-12-27 14:55:07 +08:00
ARM 可以模拟复杂指令,就像虚拟机一样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739061

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX