01
如果一个江湖侠客功夫很菜,不用问,肯定缺少一本武功秘籍。
《倚天屠龙记》中,张无忌开场也很菜,被玄冥二老虐,被何太冲虐,甚至被殷离虐,但是自从被朱长龄逼的跳下山崖,意外在白猿身上获得的《九阳神功》,依靠这本武功秘籍,张无忌修炼成绝世武功,从此独步武林,成为明教的霸道总裁,迎娶白富美郡主,成为人生赢家。
武功秘籍获得前,主角备受欺辱,获得后,英雄谁属,非我莫属。
这个就是武功秘籍的魅力。
没有一本武林秘籍解决不了的问题,如果有,就再来一本。
张无忌就先获得了《九阳真经》,又获得《乾坤大挪移》,凭此解决了六大派和明教的冲突。
但是,江湖中,普通人很难像张无忌一样直接获得武功秘籍,多数的时候,就像周星驰在《功夫》买到的如来神掌一样,大概率是假的。
在武侠中,真的武功秘籍极少,且只有主角光环才能得到。
张无忌光明顶密道里面得到乾坤大挪移;。
段誉在无量山获得北冥神功,凌波微步。
郭靖被老顽童哄骗背诵九阴真经。
这些武功秘籍是主角的专享,如果是路人甲或者NPC,根本与武功秘籍绝缘;通常修炼多年,只是给主角试招。
江湖中的工具人而已。
江湖是大侠的江湖,不是NPC的江湖。
02
而处理器的指令集也经常被人误会是武功秘籍;以为有了指令集就能笑傲处理器芯片江湖。
其实作为一个处理器芯片,能否笑傲江湖,和指令集的关系不那么大。
与武林秘籍不同的是,任何一种CPU的指令集全部是公开的。
所有技术人员都能看到,不论是行业大牛还是入行小白,均可一睹芳容。
获取CPU的指令集,不需要主角光环;不需要掉悬崖,进山洞,甚至不需要高人指点。
上网就能找到,如果找不到,说明这个指令集用的人不多。
那如果找不到,怎么办?
找不到也不要紧,软件工程师直接反汇编一下,就能完全看到运行在这个CPU的每条汇编的二进制码,可以得到这个CPU采用的每条详细指令集。
没有任何的保密需要。
也保密不了。
指令集是公开的,但是指令集本身是有主之地。
虽然公开,但是用这个指令集来设计商用CPU,要交钱,这个叫做指令集授权,我国很多做CPU的公司就获得了指令集授权,从而光明正大的使用这些指令集设计CPU。
有一些不用指令集授权,例如RISC-V,而这也开启了一个先河,就是指令集开源。
所以世界上有两种指令集,私有指令集和开源指令集。
私有指令集,就是你能够知道指令集所有细节,但是不能设计基于此指令集的商用处理器。
开源指令集,就是你能够知道指令集所有细节,但也可以设计基于此指令集的商用处理器。
前者代表如ARM,后者代表如RISC-V。
所以看起来,知道指令集细节没有什么用。
所有指令集都有办法获取细节。
关键是否允许所有人基于此指令集设计相应的商用处理器。
随着risc-v的开源,很多日子过得不如意的指令集也选择了开源,如mips power等都搞了开源联盟,唯一的缺点就是搞得太晚了。
还有一些不如意的指令集没有选择开源,是因为已经死掉了,如sparc alpha等。
这些指令集变成了历史的一部分。
03
如果指令这个东西不是“武功秘籍”,那是什么?
是硬件架构和软件生态之间的一座桥。
桥的一头是各种CPU处理器微结构设计,桥的另一头是软件及生态。
这个换成“房产领域”,叫做小区及其配套。河的一边是一个新建小区(处理器),而河的另一边是是一个商超,地铁,医院等综合配套(软件及生态)。
现在有一条河将二者隔离开。
而指令集就是连接小区和配套之间的那座桥。
使用某个指令集,就是要复用这些配套的基础设施(软件生态),就类似开发一个新盘,能有好的配套就会被疯狂抢购。
否则没有好的配套,房子就无人问津。
开发建筑容易,而配套却是很长时间的积累。
说这么多,硬核高科技的处理器和卖房子也区别不大。
一个服务器处理器跑分再厉害,没有各种生产力工具和EDA工具支持,也很难被服务器厂商选用。
一个手机处理器跑分再厉害,如果装不了APP和玩各种游戏,也少有用户来买。
买房子,是地段和配套。
处理器,除了性能,功耗,价格。
软件和生态则是一个更重要的评价维度;
04
根据同一个指令集,但是设计出来的处理器却是千差万别。
可以设计的很简洁,也可以很复杂。
包括:通常一个处理器的设计包括,取指令,译码,执行,写回,访问存储等等,这些都是每个处理器都有的部分。根据对处理器的应用需求不同,一个处理器的架构设计千差万别。
1、流水线的级数:一般级数越多,在同一个制程下,处理器可以运行的频率越高。高性能处理器的流水线可以到十几级,例如玄铁910就有12级流水线。
2、并行发射宽度:并行发射的宽度越宽,则同时可以参与计算的单元就越多,计算的效率就会越高,但是如果指令之间存在依赖关系,那么多余的资源就闲着用不上,只能串行执行。比如,即使有两路逻辑运算单元,如果下一次的计算需要用到上一条指令的结果,也只能串行运行;
3、cache的设计:抛开组相联、全相连等等那些概念不谈,cache就是越大,对于处理器的IO操作越有利,LOAD指令越省周期。正常的一个处理器核,CACHE占用的面积比处理器的那些逻辑的面积还要大,CACHE的就是能够缓存外部存储区的内容;同样数据和指令的获取是否需要CACHE需要根据设计设计。
4、MMU的设计:如果支持OS,那么MMU就是一个省不了的单元,需要把虚拟地址转换成物理地址。
5、多核的架构:一个核能力有限,就堆核来搞,这就容易出现一核有难,八核围观的现象,如何把任务分配到多个核上,让所有核都动起来,这是多核设计的一个关键之处。
上面说了这么多处理器设计方面,和指令集相关的不多。任何一个处理器架构都是需要考虑这些设计方面,和哪种指令集关系不大;
上图是西数RISC-V的实现,9级流水线,双发射;开源指令集,IP代码也是开源。
按照这个架构,如果要是换成其他的指令集,例如ARM/MIPS,也同样可以设计成这个架构。
所以有人说指令集是语言,处理器是论文,用哪种语言都可以写成高质量论文,这样看来,还是有一些道理;
架构和指令集是两回事。设计者如果拥有设计处理器的能力,用什么指令集都可以。
架构是架构,指令集是指令集;
相互依存又相互独立;
05
华山之巅,觉远大师来讲“九阳真经”,张三丰听了部分,演化为“武当九阳功”,郭襄记了一部分,就是“峨眉九阳功”,无色禅师听了一部分,就变成“少林九阳功”;
武功同宗同源;
如果我们来看待RISC指令集的时候,我们就会发现,他们之间也是同宗同源
一个通用的RISC的指令,通常指令通常包括下面几种:
算数运算:加减乘除;
逻辑运算:与或非,左移右移;
跳转指令:实现程序的循环和跳转;
比较指令:大于,小于,等于;
内存读写:LOAD、STORE;
特殊寄存器操作:读写特殊寄存器;
除了通用指令之外,还有特殊指令,例如浮点指令,向量指令,特殊定制指令等等
下面是三种指令集为例,是不是看起来很相似?
特别是MIPS和RISC-V指令集相似程度就更高了,像是兄弟。
以这三种指令集为例,编译后,都是32bit的0/1的二进制码;
CPU设计就是根据这些0或者1进行译码和运行,得到预期的结果。
不论多高级的软件,最终编译出来,就是这一系列0和1 的二进制码的组合;
软件工程师的工作,则是把写好高级语言,翻译成“0”和“1”。
指令集作为软件和硬件的接口。
这些接口就体现在这些0或者1之间。
一种沟通软件和硬件的编码方式。
“有效沟通”是衡量一个工程师能力的方面之一。
而指令集就是软件和处理器硬件核心的沟通方式,没有之一;
06
天下武功出少林。
天下的RISC的指令集也是极其类似,
指令集同宗同源,但是又不断与时俱进;
如果一个大侠定义了一套武功(指令集),降龙十七掌,这十七掌有十七个招式,就是加,减,乘,除,左移,右移等等
实际行走江湖时,很多时候,一招是解决不了大的boss,这个时候就需要用到前面的十七招组合,才能最大限度的提升掌法的威力;
大侠就给定制一项新的招式(指令),降龙第十八掌,叫做“亢龙有悔”
这个深得指令集设计的真髓。
如果不定义第十八掌“亢龙有悔”,则前面“十七掌”需要运行17个周期。
现在我们定义了一条新的指令“亢龙有悔”。一个周期就解决问题。效率提升了17倍。
电影《苏乞儿》中,周星驰扮演的主人公苏乞儿最后一掌“亢龙有悔”解决掉大boss,悟到了第十八掌是前十七掌的组合。苏乞儿通过这些基本招式的组合成额外的一招,提升了掌法的威力,是我国古代优秀的指令集设计者。
但是,作为CPU设计来说,增加这一条指令也是有代价的,代价就是增加了更多的晶体管,造成了面积、成本及功耗增加。
应用需求推动指令集的升级和扩展是指令集发展中最常见的扩展。
例如为了加速AES加密的效率;ARMv8 推出了 cryptographic extention,不但是AES,其他每种加密算法都有相应的扩展指令;X86同样也做了类似的事情:做了AES-NI指令;
目前 AI比较火,所以ARM V9 在ARM V8的基础上添加了一些AI的加速指令,虽然细节未知,通过SIMD的指令扩展,应该会有类似矩阵乘法加速指令。intel AVX512也做了类似的事情,支持AI的加速。
这些指令是有助于CPU来有效的应对AI的应用挑战,但还是被很多体系结构领域的大神认为是“鸡肋”,这个就是见人见智的事情了。
新的指令能否加速AI的应用是有疑问的。
但新的指令带了更多开销却毋庸置疑,这些额外的扩展指令会额外增加很多的晶体管,也就是会增加面积,成本,功耗。
而这些额外增加的晶体管在很多常用场景下并不发挥作用,代价增加还可能不带来性能的增加因为用不上。
需要解决新的问题,就需要新的指令的出现。这个就是新的指令的由来。
从这个意义上说,目前的好多AI专用处理器,都是自己定义了一套适合AI处理的指令集,例如,矩阵乘,卷积等操作。
指令集不但是同源的,而且是不断发展的。
07
处理器面对的场景越来越多,新的指令也就是层出不穷。
原有指令固然需要继续兼容,新推出的也不一定得到广泛的支持;对于同一个指令集,一个处理器也不需要支持全部完备的指令集,而是根据需要选择来支持;
指令集的发展从来没有结束,也没有尽头。
处理器想要更高效,就需要不断添加新的指令来解决新的问题。
新的指令的支持带来了新的面积,功耗,成本,软件等代价。
而处理器设计本身,就是tradeoff的艺术。
效率和开销之间的平衡。
这个就是宿命。
和指令集相关又无关的宿命。
而如何打破这些宿命。
则需要处理器设计工程师自身的能力和智慧。
作者:歪睿老哥
来源:https://mp.weixin.qq.com/s/l72wmDlbCO6cAx--I9fD\_Q
作者微信公众号
相关文章推荐
更多IC设计技术干货请关注IC设计技术专栏。