处理器指令集,不是一本武功秘籍
如果一个江湖侠客功夫很菜,不用问,肯定缺少一本武功秘籍。《倚天屠龙记》中,张无忌开场也很菜,被玄冥二老虐,被何太冲虐,甚至被殷离虐,但是自从被朱长龄逼的跳下山崖,意外在白猿身上获得的《九阳神功》,依靠这本武功秘籍,张无忌修炼成绝世武功,从此独步武林,成为明教的霸道总裁,迎娶白富美郡主,成为人生赢家。武功秘籍获得前,主角备受欺辱,获得后,英雄谁属,非我莫属。没有一本武林秘籍解决不了的问题,如果有,就再来一本。张无忌就先获得了《九阳真经》,又获得《乾坤大挪移》,凭此解决了六大派和明教的冲突。但是,江湖中,普通人很难像张无忌一样直接获得武功秘籍,多数的时候,就像周星驰在《功夫》买到的如来神掌一样,大概率是假的。在武侠中,真的武功秘籍极少,且只有主角光环才能得到。这些武功秘籍是主角的专享,如果是路人甲或者NPC,根本与武功秘籍绝缘;通常修炼多年,只是给主角试招。
而处理器的指令集也经常被人误会是武功秘籍;以为有了指令集就能笑傲处理器芯片江湖。其实作为一个处理器芯片,能否笑傲江湖,和指令集的关系不那么大。与武林秘籍不同的是,任何一种CPU的指令集全部是公开的。所有技术人员都能看到,不论是行业大牛还是入行小白,均可一睹芳容。获取CPU的指令集,不需要主角光环;不需要掉悬崖,进山洞,甚至不需要高人指点。上网就能找到,如果找不到,说明这个指令集用的人不多。找不到也不要紧,软件工程师直接反汇编一下,就能完全看到运行在这个CPU的每条汇编的二进制码,可以得到这个CPU采用的每条详细指令集。虽然公开,但是用这个指令集来设计商用CPU,要交钱,这个叫做指令集授权,我国很多做CPU的公司就获得了指令集授权,从而光明正大的使用这些指令集设计CPU。有一些不用指令集授权,例如RISC-V,而这也开启了一个先河,就是指令集开源。私有指令集,就是你能够知道指令集所有细节,但是不能设计基于此指令集的商用处理器。开源指令集,就是你能够知道指令集所有细节,但也可以设计基于此指令集的商用处理器。关键是否允许所有人基于此指令集设计相应的商用处理器。随着risc-v的开源,很多日子过得不如意的指令集也选择了开源,如mips power等都搞了开源联盟,唯一的缺点就是搞得太晚了。还有一些不如意的指令集没有选择开源,是因为已经死掉了,如sparc alpha等。
桥的一头是各种CPU处理器微结构设计,桥的另一头是软件及生态。这个换成“房产领域”,叫做小区及其配套。河的一边是一个新建小区(处理器),而河的另一边是是一个商超,地铁,医院等综合配套(软件及生态)。使用某个指令集,就是要复用这些配套的基础设施(软件生态),就类似开发一个新盘,能有好的配套就会被疯狂抢购。一个服务器处理器跑分再厉害,没有各种生产力工具和EDA工具支持,也很难被服务器厂商选用。一个手机处理器跑分再厉害,如果装不了APP和玩各种游戏,也少有用户来买。
根据同一个指令集,但是设计出来的处理器却是千差万别。包括:通常一个处理器的设计包括,取指令,译码,执行,写回,访问存储等等,这些都是每个处理器都有的部分。根据对处理器的应用需求不同,一个处理器的架构设计千差万别。1、流水线的级数:一般级数越多,在同一个制程下,处理器可以运行的频率越高。高性能处理器的流水线可以到十几级,例如玄铁910就有12级流水线。2、并行发射宽度:并行发射的宽度越宽,则同时可以参与计算的单元就越多,计算的效率就会越高,但是如果指令之间存在依赖关系,那么多余的资源就闲着用不上,只能串行执行。比如,即使有两路逻辑运算单元,如果下一次的计算需要用到上一条指令的结果,也只能串行运行;3、cache的设计:抛开组相联、全相连等等那些概念不谈,cache就是越大,对于处理器的IO操作越有利,LOAD指令越省周期。正常的一个处理器核,CACHE占用的面积比处理器的那些逻辑的面积还要大,CACHE的就是能够缓存外部存储区的内容;同样数据和指令的获取是否需要CACHE需要根据设计设计。4、MMU的设计:如果支持OS,那么MMU就是一个省不了的单元,需要把虚拟地址转换成物理地址。5、多核的架构:一个核能力有限,就堆核来搞,这就容易出现一核有难,八核围观的现象,如何把任务分配到多个核上,让所有核都动起来,这是多核设计的一个关键之处。上面说了这么多处理器设计方面,和指令集相关的不多。任何一个处理器架构都是需要考虑这些设计方面,和哪种指令集关系不大;上图是西数RISC-V的实现,9级流水线,双发射;开源指令集,IP代码也是开源。按照这个架构,如果要是换成其他的指令集,例如ARM/MIPS,也同样可以设计成这个架构。所以有人说指令集是语言,处理器是论文,用哪种语言都可以写成高质量论文,这样看来,还是有一些道理;架构和指令集是两回事。设计者如果拥有设计处理器的能力,用什么指令集都可以。
华山之巅,觉远大师来讲“九阳真经”,张三丰听了部分,演化为“武当九阳功”,郭襄记了一部分,就是“峨眉九阳功”,无色禅师听了一部分,就变成“少林九阳功”;如果我们来看待RISC指令集的时候,我们就会发现,他们之间也是同宗同源一个通用的RISC的指令,通常指令通常包括下面几种:除了通用指令之外,还有特殊指令,例如浮点指令,向量指令,特殊定制指令等等特别是MIPS和RISC-V指令集相似程度就更高了,像是兄弟。以这三种指令集为例,编译后,都是32bit的0/1的二进制码;CPU设计就是根据这些0或者1进行译码和运行,得到预期的结果。不论多高级的软件,最终编译出来,就是这一系列0和1 的二进制码的组合;软件工程师的工作,则是把写好高级语言,翻译成“0”和“1”。
而指令集就是软件和处理器硬件核心的沟通方式,没有之一;
如果一个大侠定义了一套武功(指令集),降龙十七掌,这十七掌有十七个招式,就是加,减,乘,除,左移,右移等等实际行走江湖时,很多时候,一招是解决不了大的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处理的指令集,例如,矩阵乘,卷积等操作。
处理器面对的场景越来越多,新的指令也就是层出不穷。原有指令固然需要继续兼容,新推出的也不一定得到广泛的支持;对于同一个指令集,一个处理器也不需要支持全部完备的指令集,而是根据需要选择来支持;处理器想要更高效,就需要不断添加新的指令来解决新的问题。新的指令的支持带来了新的面积,功耗,成本,软件等代价。
*免责声明:以上内容仅供交和流学习之用。如有任何疑问或异议,请留言与我们联系。