分享

[虾说IT]22. x86与ARM架构的恩怨情仇

 godxiasad 2023-04-21 发布于北京
首先虾神就是个码农——标准写代码的那种,所以要说编程、算法、架构,勉勉强强算是个业内人士,而要谈起硬件架构,那也就是半个门外汉……读书的时候考过三级A(懂得都懂),不过这么多年早就还给老师了。
要说X86和ARM,从学术、技术上来说,列个几万字的论文或者写个几十万字的专著都说不完,本着我们虾说IT的原理,说人话,让大家都能听懂,我们就不去聊哪些太专业的名词了(不要问,问就是我也不记得啥意思了),今天就来看看最简单的几句区别。

首先这两个架构,都是用来形容CPU的,CPU顾名思义:“中央处理器”,就用来执行计算的核心部件,那么计算是如何执行的呢?例如1+1,在计算机中里面,要经历如下进程:
1、从寄存器中取出一个数值
2、送入累加器中
3、累加得到结果
4、结果推送到寄存器中去
这每一个步骤,称为一个指令(好了,这是一个很重要的概念,做上标记)。
然后问题来了,假设CPU里面只有累加器,但是没有乘法器(现代CPU里面已经有硬件乘法器,我这里是打个比喻)……要做乘法怎么办?
很简单,比如5*5 = 5 + 5 + 5 + 5 + 5,打完收工。
这样,就把乘法这个复杂操作指令,简化为了5次加法这种简单操作指令了。
虽然这么做很方便,但是对于早期程序员来说,就是噩梦啊,明明可以一个指令搞定的时候,你要写五条指令……乘以5还好说,要是乘以10万呢……(就算有循环也不好使啊)
好死不死的,早期的寄存器贵得令人发指,如下表所示,80年代初,64kb的内存的价格就高达400USD……
我的指令要执行,就先要放到内存里面去……想要多跑几条指令,那就是妥妥的撒币:
所以搞硬件架构那些猛人就想:我能不能把这些单条指令组合起来,变成一些集成的,功能强大的指令呢,比如把多次加法这种简单的指令集,做成一个乘法指令,这样要做乘法的时候,就不用调用多次加法操作,只用调用一条乘法指令就可以了。
然后,这种把简单指令集进行组合的架构,就叫做复杂指令集CSIC:Complex Instruction Set Computer),而也就是x86所使用的架构。
那么原始的,没有进行组合的指令集架构,就是所谓的精简指令集(RISC:Reduced Instruction Set Computer),ARM就是最出名的一种精简指令集架构(ARM:Advanced RISC Machine)。
在精简指令集上,所有的指令都是最基础的原生微指令集,每条指令都是原子化的最小状态存在,所以二者最大的区别就是:
x86:提供了一个开箱即用的组件箱,里面都是出厂就做好的成品组件:发动机、轮胎、座椅、轴承、车身框架……作为系统程序员,你需要把每个部件安装到合适的地方去,就可以了,这样就能很轻松的组装起来一辆能跑的汽车。
而Arm,则提供给你的是一批零件,而且是最细粒度的零件……你需要先用这些零件拼成汽车的各个部件,如发动机,然后才能组织成一辆汽车。
在PC时代,x86以其标准化的设计架构和对细节复杂度的隐藏,以及对于内存的节约,取得了大获全胜,所以PC时代就被认为是x86的时代。
实际上精简指令集在80年代也流行过一时,包括Arm,也是早在1983年就开始研发的,包括Intel、德州仪器、AMD这些大佬们,也都出过精简指令集的CPU,但是因为种种原因(特别是性能低下、适配的软件和操作系统不足),都没有成气候,一直到智能手机的兴起。
智能手机早期根本不用考虑PC需要运行的那些软件,所以追求低功耗,有限可用功能成为了第一要务。而随着手机操作系统的逐步完善,软件定义硬件这个概念慢慢成为实现。
何为软件定义硬件呢?
举个简单的例子,今年10月份,DeepMind的AlphaTensor使用AI,发现了一种人类从未发现过的,颠覆性的矩阵运算模式,能够在现有矩阵算法进行了大幅度的提升。这个成果被发布到了最新一期 Nature 封面论文《Discovering faster matrix multiplication algorithms with reinforcement learning》中。
矩阵运算是计算机最基础运算模式,比如三维游戏里面,随便一个动作一个画面变换,就能发生几万次矩阵计算:
那么如果底层算法发生了进化,每次运算能够提升1%的性能,那么整体系统的性能可能就会翻天覆地。
但是这种底层算法被改进了,精简指令集只需要通过编译器或者操作系统等软件升级就能够快速从底层进行实现,并且快速反馈到上层应用中,让大家感受到性能提升了。但是复杂指令集就麻烦了……可能需要对硬件进行升级或者硬件指令重新烧入,甚至有能要等到下一代CPU出现,才能完成升级,这样就远远落后了。
当然,今天的软件开发人员,得益于编译器的强大,以及内存价格的持续下降,我们不再与底层各种基础指令打交道,也不在过分关心我们的代码需不需要在节约那几k内存(甚至是能不能节约几G的内存,很多时候都不用考虑了)……,所以具体是用复杂指令集还是用精简指令集,在大部分应用级程序员的知识体系里面,已经没有啥存在感了。但是如果作为系统级程序员,还是有必要了解一下的。
最后,有同学问,ARM这么先进,为什么目前ARM架构的CPU,无论在速度还是在能力上,都不如x86呢?(苹果那种M系列芯片,专门用剪视频这个单项来吊打x86 + Windows的情况例外……)
实际上,ARM和x86从架构上,并没有优劣之分,威斯康星大学的研究人员专门发表了一系列研究论文,在剔除调制程工艺、操作系统、专项优化这些外界因素之后,CPU的性能和功耗上看,二者之间的并没有太大的区别(下文中的3、4、5)。
但是为什么从现阶段看,x86芯片的性能,要吊打同档次的Arm架构的芯片呢?
从上面研究的论文的结论反推过来看,x86吊打Arm的原因,恰恰就是这些外界因素:制程工艺、操作系统和专项优化。Intel和AMD这两家x86大佬,在制程工艺上,一直领先Arm一众厂商——直到苹果的M系列横空出世。
2020年,苹果的自研的Arm架构,联合已经在制程工艺上追平了Intel的台积电,推出了M系列芯片,并且在他自己的macbook上进行了All in操作,不得不说,苹果优秀的软硬件调教能力,让M系列芯片在wintel联盟中杀出了一条血路,这又是另外一个故事了。
最后,说说结论:
1、x86和arm单从硬件性能上看,上并没有太大区别,但是我们目前所有软件,都不是跑在芯片上的,而是跑在操作系统上,操作系统对谁支持得好,那么谁的性能就肯定好。
所以,用在windows系统上,就暂时别想着Arm能够追平x86了(微软自己搞过ARM的windows,结果不用我说了……不过未来还会不会有再度启航的ARM优化版Windows,还不好说)。
但是服务器上,比如用Unix/Linux(甭管有没有披着国产皮),在编译器和操作系统底层足够优化的情况下,Arm追平甚至追上x86,是指日可待的事情。
2、x86几十年在PC市场上留下的庞大软件帝国,要迁移到ARM上,几乎是不太可能的事情,就说一句:目前所有的工业软件、工程仿真软件都是基于x86架构做出来的,比如Matlab,要想重新移植到Arm架构下,那几乎是一个不可能完成工作。
但是新的软件则不然,例如Rust语言,在创立之初就已经对Arm架构进行了适配和优化,2021年,ARM正式加入Rust基金会,而Rust已经成为了除C以外的Linux第二门内核语言,随着这样的新语言编写的操作系统和软件越来越多,Arm的支持阵营也会越来越庞大。
3、Arm要在PC市场上抢下多大地盘,关键还是要看苹果……作为码农,我更关心的ARM上能多出多少生产力工具和游戏,能够建立起一个什么的Arm新生态。
4、在这个变化的时代,ARM更契合软件定义硬件的理念,从我个人角度来看,我更看好ARM,因为它这种更细粒度的简单指令集架构,天生更能够适应现在快速的发展变化。
最后的最后:
把ARM架构视为国产自主领域的弯道超车或者绝地求生的救命稻草,大可不必,我国像华为一样拥有ARM永久授权的厂商海光、兆芯也是基于x86架构的CPU,如果我们的软件的主阵地还在pc领域,那么x86环境,就依然是主阵地。
当然,ARM代表的是另外一条道路,作为软件开发人员,我们将保持持续的关注,说不定哪天,就变天了呢?

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多