1
bnrwnjyw 2020-12-25 23:12:21 +08:00 via iPhone 2
复杂指令总是能用简单指令代替的,也不可能完全一对一。几条加减法指令能创造出无穷的运算。
|
2
des 2020-12-25 23:21:34 +08:00
并不是所有指令集都能那么容易替代的,比如 AVX 指令,Rosetta 2 目前还不能支持
|
3
systemcall 2020-12-25 23:43:29 +08:00
除了指令,还有寄存器
jvm 的指令,一般的 CPU 也不是都有吧 转译不是那个意思吧。又不是同架构的 hypervisor |
4
BrettD 2020-12-25 23:45:19 +08:00 via iPhone
ARM 没有自带那个指令也可以软件层面模拟
|
5
lcdtyph 2020-12-25 23:50:38 +08:00
有没有特殊指令不知道,但是苹果肯定是在 M1 硬件里对 x86 的内存模型进行特别支持了
|
6
love 2020-12-26 00:27:26 +08:00 via Android
都是图灵完备的,可以效率低没有不能转的
|
7
wdlth 2020-12-26 00:47:24 +08:00
很多 SIMD 指令集是可以相互转换的,可以看看这个项目:
https://github.com/simd-everywhere/simde |
8
LukeChien 2020-12-26 00:55:25 +08:00 via Android
也不一定全转换吧,x86 也是有兼容逻辑的,例如 AVX2 也并不是所有都支持,转换最低可用版本或者一条转多条
|
9
loading 2020-12-26 01:40:45 +08:00 via Android
说到底还是晶体管,只要最简单的汇编能写出来就能兼容,除非(遇事不决)量子力学。
|
10
YuiTH 2020-12-26 02:07:48 +08:00
一个简单的事实:不是每个 x86 芯片都支持每条 x86 指令的。比如桌面 U 基本都不支持至强才有的 AVX512 。
所以就很简单了,Windows 是要保证兼容性的,大多数软件也没弱智到只适配某一个 CPU (有的话在大多数的 X86 兼容机上也无法运行),那么 M1 只要转译一个够常用的,对本代或者前几代桌面 x86 基本覆盖的现代指令集就好了。 |
13
loading 2020-12-26 08:06:37 +08:00 via Android
@lewis89 我大学用汇编就写过计算器了,连乘法器都没有的单片机,所以你说的 libc 模拟我都不需要。
|
14
blackcatxh 2020-12-26 12:55:09 +08:00 via iPhone
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. |
15
CismonX 2020-12-26 13:11:19 +08:00 via iPhone 1
@YuiTH #10 从十代开始,基本上都支持 AVX512 了
在这之前有 i3-8121U,相当低端的移动端 U,两年前 Intel 刚开始试水 10nm 的时候搞的,体质差到核显都不得不屏蔽掉,但是它支持 AVX512 。。 |
16
YuiTH 2020-12-26 13:52:45 +08:00
@CismonX 我隐约记得有这么个事,所以加了一些“大概” “基本”的词保证严谨。
anyway,重要的核心观点不影响,绝大多数系统和软件都是会根据所处的平台决定执行的代码的。如果观察过./configure 一类的配置过程的话,就会发现里面在检查大量库与指令集的兼容性,都是为了保证兼容性。不然只能在十代跑岂不是还不如 M1 了。 |
17
CismonX 2020-12-26 14:52:50 +08:00 via iPhone
@YuiTH #16
嗯,我做过 SIMD 开发。一般来说向用户直接分发二进制的程序,为了兼容性,都有运行期检测 CPUID 的操作 只需要分发源码的时候,会有诸如 #ifdef __AVX512F__ 这种操作,这种情况对于 Rosetta 来说是一种挑战,需要它对各种扩展指令集做模拟。这件事情 Intel SDE 很多年前就在做了,可以在几乎任何自家 CPU 上模拟扩展指令集 当然,即使 Rosetta 不支持也没有问题,因为用户可以重新编译。。 |
18
wanguorui123 2020-12-27 14:55:07 +08:00 via iPhone
ARM 可以模拟复杂指令,就像虚拟机一样
|