V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liudaqi
V2EX  ›  macOS

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

  •  
  •   liudaqi · 2020-12-25 22:58:07 +08:00 · 3177 次点击
    这是一个创建于 1463 天前的主题,其中的信息可能已经有所发展或是发生改变。
    x86 指令集也有几代的版本(最新版大约有 100 多条指令),ARM 同样也发展了好几代指令集版本( v8 版也有上百条指令),x86 -> ARM 都能找到一一对应的转译指令吗?会不会出现 ARM 中找不到对应的 x86 指令的情况?

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

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

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

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

    当然,即使 Rosetta 不支持也没有问题,因为用户可以重新编译。。
    wanguorui123
        18
    wanguorui123  
       2020-12-27 14:55:07 +08:00 via iPhone
    ARM 可以模拟复杂指令,就像虚拟机一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:52 · PVG 05:52 · LAX 13:52 · JFK 16:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.