当RISC遇上CISC:芯片里的“变形记


你有没有想过手机里那颗神秘的Arm芯片,和电脑里那颗不太听话的x86芯片,为什么一个聪明得像个小精灵,另一个却像老爷爷一样慢吞吞?大家总说Arm是RISC、x86是CISC,听起来像是各种小标签,但实际上,这个标签早已无法囊括这些硬件的真实模样。

首先,让我们把时间拨回到1978年,Intel 8086那个年代。那时,微码就像是局域网里的小喇叭,负责发号施令。它们藏在芯片的ROM里,指挥着每条指令的简单动作。反向工程大师Ken Shirriff就像是探索迷宫的勇士,发现了这个控制存储里的512条微指令,每条都在为75种指令忙活着。微码在当年就像是在为复杂指令做配乐,简直是大型机的老大哥!但是,斯坦福的John Hennessy和伯克利的David Patterson在一次图灵奖的颁奖典礼上提到,VAX指令中有20%却占用了60%的微码,结果却只贡献了0.2%的执行时间。听上去像是在玩“洗牌”游戏一样,根本没什么实用价值。这时候,RISC的灵光一闪而过:让指令更简单,让硬件不用微码就能干活,这就像是把繁琐的三道菜简化成快餐,让大家都能快速上手。

在1980年代初,MIPS和RISC-I的登场验证了这个思路。Patterson甚至提到过,他在DEC修复VAX微码时真切地体验到复杂度的痛苦。他讲述了一个“悲剧”:让电脑设计得那么复杂,既增加了成本还得打补丁,简直是疯了!对了,现在的Intel和AMD可是不时给我们推送微码更新,真是讽刺。 0

时间来到了1980年代末,许多人预测x86要灭亡了。但Intel在面临选项时采取了另一个主意:留下指令集,改进执行方式。1989年的486展现了x86的“变形术”:五级流水线工作起来像是在一场马拉松中超速奔跑,条件合适时每个时钟能执行一条简单的指令。可复杂指令仍然很磨叽,比如说,更新内存的加法就要等三个周期!

在90年代中期,NexGen的Nx586可谓是抢了x86的“风头”,他们把x86指令翻译成更简单的操作,算得上是x86的首次RISC里程大改良。接着,AMD的K5紧跟其后,混合了一些老本行,解码器把x86指令化为一到四个内部操作。1995年,Intel终于跟上了潮流,推出Pentium Pro,通过解码器把x86指令翻译成微操作。这就像是把复杂的食谱简化为一份时尚快餐,让高性能的RISC设计手法能快速入驻。

现代的Arm核也没闲着,指令变得越来越复杂,甚至有时拆成几十个微操作。就拿富士通的富岳超算来说,那SVE指令FADDA展开成了63个微操作。RISC指令不是简单的“开门见山”,反而像是一道复杂的拼盘,还吸取了x86的部分经验,比如缓存已解码的操作,来提升效果。2019年,Cortex-A77的宏操作缓存也是“黑科技”的举动,复用了解码成果,提升了效率,简直就是把老祖宗的智慧发扬光大。 0

不过,不是所有人都能接受“x86里有RISC核”这个说法,连设计者本人也不太赞同。Pentium Pro的设计师Colwell就反驳说,把x86微操作称作“类RISC”是不合适的,因为指令集和硬件实现是两回事。芯片设计的路上,真正值得关注的是如何兑现承诺,而不仅仅是挂上各类标签。

所以,下次当你拿起手机或电脑,记得再看看这颗小小的芯片,它们可比标签要复杂得多哦!

about image