从劳动分工的角度理解CPU、FPGA和ASIC

简介

ASIC指的是专用集成电路(Application Specific Integrated Circuit),是专门针对单一用途而设计的集成电路产品。我第一次看到这个名词是在比特币矿机的新闻里。比特币的挖矿方式从CPU发展到GPU,再到FPGA和ASIC,也表明了对于挖矿这种特定应用,CPU的通用计算模式远不如ASIC来得高效。

FPGA是Field Programmable Gate Array(现场可编程逻辑门阵列)的缩写,属于ASIC中的一种半定制电路。FPGA既有硬件电路的高性能,又能通过编程对电路做一定程度的灵活定制,算是介于CPU和ASIC之间的产品。由于它兼具性能和可编程性,加上最近成本在快速下降,因此未来发展前景非常可观,这两年一些云计算厂商都开始提供FPGA的云服务。

CPU则是用于通用计算。世界上第一台通用电子计算机是ENIAC,不过它的通用计算是通过手工改变面板的插接线来实现的,灵活性较差。后来的计算机采用了冯诺依曼提出的存储程序模型,可以从存储设备加载程序,解码和执行指令,具有更高的灵活度。

FPGA则跟ENIAC有点类似,但不再是靠手工改变面板的插接线,而是在特定模式下加载指令程序来设置电路状态,实现指定的计算功能,这样既能拥有一定的灵活度,又能达到较高的计算性能。

我对FPGA和ASIC的认识很有限,只是前段时间看到一篇讲FPGA的公众号文章(老石谈芯-可定制计算的“自动化”和“民主化”),开始对CPU和FPGA/ASIC的差别有了一些思考,所以想写篇文章来梳理一下自己的想法。

为什么关注芯片和电路

我的工作内容其实跟芯片和电路没有直接关联,但我还是比较关注芯片层面的知识和技术,这不只是因为计算机体系结构是计算机专业的必修课,是软件开发的基础,而且也是觉得芯片虽小,但在计算模型上,和分布式系统是类似的。分布式系统主要在错误模型上有些不同,需要对部分节点和通信链路做容错处理。不考虑错误处理方面的差别,对于计算存储分离的Hadoop集群,如果把HDFS节点比作硬盘,把MapReduce计算节点比作CPU的核,那么分布式系统跟PC可以看成是等价的。所以,理解了芯片和计算机体系结构,可以帮助我们更好的理解计算的本质,也能更好的理解分布式系统和分布式计算。

CPU为什么比ASIC慢

“你们可以想一想CPU是怎么进行加法操作的。第一件事是从缓存或者内存里拿到这个指令放进处理器流水线。这个过程就已经有9%的能量消耗了。接着指令需要被解码从而CPU才知道这条指令到底要做什么事情,这里又有6%的能耗。因为现代处理器可以支持乱序执行,这样指令很有可能要被重命名来解决一些冲突的问题,这又导致12%的能耗。接下来从寄存器堆拿数据又产生3%。现在万事俱备就等着做加法了,等待数据会有11%的能耗。最终实际的计算部分只占了14%能耗,而剩下的杂事又产生23%能耗。在以上CPU的一系列操作中实际上只有做加法这一步是你关心的。然而,为了得到正确的加法结果一条加法指令需要走一个非常复杂的计算流水线。这就是为什么CPU不高效的原因。”

上面这段话是从前面的那篇公众号文章中节选出来的。从中可以看出,CPU低效的根源就在于它的通用性和灵活性。为了达到通用计算的目的,CPU的硬件电路只实现基本的运算和数据访问功能,然后外部程序会将指令以各种方式组合起来以实现复杂的逻辑。这样虽然能满足各种应用开发的复杂需求,但有很大的性能开销,对于一些特定的应用场景,则不如ASIC适用。例如用CPU来挖比特币早就没有性价比可言了,专业矿工都是使用ASIC矿机。再如Intel的部分处理器就把AES加密算法固化到芯片中,直接使用硬件实现,以提高加密算法的性能。

劳动分工

通用处理器跟专用芯片的性能差别,让我想到斯密的劳动分工理论。斯密在《国富论》中举过一个例子,他考察了苏格兰的制针业,当时的制针过程,从绞铁条到拔细抛光,再磨细针头,装针后边的那个小球,然后包装到一个纸盒里,共18个环节。一个工人如果是独立制针的话,即使再努力,一天制出的针也不超过20根。但如果每个工人只负责其中的一道工序,平均每个工人每天可以制针4800根。

劳动分工的效率之所以高,可以从几个方面去理解:

  1. 不同的工序需要的知识、技能和经验不同,分工不仅可以降低工人的学习成本和门槛,而且还可以让他们集中精力熟悉和改进自己的操作,提高单个工序的效率和质量。
  2. 工序的设计本身就是生产经验的总结和具现化,在分工场景下,每个工人不需要去了解和摸索最优的生产方式和流程,只需要把自己负责的工序做好,就能达到全局最优的产出。
  3. 从生产过程看,分工可以缩小工人操作中的必要活动范围,减少各个生产环节衔接中耗费的时间,工作熟练后还能形成肌肉记忆,进一步提高工作效率和质量。从认知心理学的角度讲,人的短时记忆容量有限,分工能让工人把注意力集中在少数操作,减少不必要的上下文切换,从而提高效率。

用制造行业来做类比的话,工业化的流水生产线就像ASIC,只能制造特定的产品,灵活度低,但效率很高。手工制作就像是CPU计算,灵活度高,但效率低。3D打印就像是FPGA,兼具灵活度和效率。当然,由于材料和工艺的限制,目前3D打印的应用场景比较受限,不过未来的柔性制造应该能更好的对流水生产线进行智能化改造,使其在保留高效率的同时,提高灵活度,更好的满足各种快速变化的市场需求。

缓存和数据局部性

进一步分析上一节的第三点,专注能提高效率,原因可以归结为缓存和数据局部性。数据局部性对运算的过程影响很大,例如CPU的寄存器、一级缓存、二级缓存、内存、硬盘都是离计算越来越远,速度也越来越慢。CPU的NUMA架构中,不同核心访问内存的不同位置的速度也不同,在设计系统和各种算法时需要考虑这些因素。

心理学中,人的记忆分感觉记忆、短时记忆和长时记忆,就像计算机系统中不同层次的缓存和存储。不管是体力劳动还是脑力劳动,工作内容变来变去就会影响工作效率。分工可以使得每个工人或每个模块专注于自己的一小部分工作,感觉记忆和短时记忆里的信息可以反复使用,避免重复的从长时记忆里加载,就像电脑把进程的工作集数据尽可能保留在最近一级的缓存中,使得数据的访问速度更快,操作更快,效率更高。

再扯远一点,用系统论的话来说,数据局部性的根源是系统的不均匀性。系统总会是不均匀的,均匀的系统是死的系统,现实系统会因为不均匀性而形成各种不同的物质、不同的形态和不同的运动。不止物质世界,人类社会也会因为不均匀性而形成不同的城镇、不同的行业、不同的阶层。软件设计在很多时候就是需要对非均匀系统做分割,把联系紧密的节点划分在同一个模块内,充分利用模块内部的高效沟通和运转,降低模块之间的不必要通信,从而提高整个系统的效率。

异构计算

异构计算由来已久,计算和存储的分离、各种硬件设备中的控制芯片都是异构计算的代表。例如硬盘、网卡、各种总线等的控制芯片,都是通过专门的电路完成特定的控制任务,以降低CPU的负载,提高整个系统的性能。

近年来,由于CPU的单核性能增长缓慢,多核和异构计算技术越来越受重视。例如ARM的big.LITTLE架构,就是通过低频和高频核心的搭配,由高频核心负责少量和短时的高性能计算,由低频核心负责需要长时间运行的控制逻辑,以达到省电的效果。CPU和GPU/FPGA/ASIC的搭配也是异构计算的趋势之一。

间接层

“All problems in computer science can be solved by another level of indirection.”

为了实现通用计算的目标,CPU需要从外界加载指令,这实际上是增加一个指令解释的间接层,这样CPU执行的操作都由外部的软件来定义,可以提供最大限度的灵活性。缺点是影响了性能,不过这跟带来的好处相比不算什么,特别是在CPU性能快速提升的时代。

前面提到,FPGA是可编程的电路阵列,既保留硬件电路的高效,又通过增加一层很薄的可编程的间接层,来提高计算的灵活度,满足各种复杂应用的需求。

现在流行的Docker、SDN、SDS等概念,也都是通过增加间接层来实现硬件的虚拟化、软件化,进而实现云计算所需的资源的池化和弹性管理的目的。

间接层也是软件架构设计中的基本方法,模块接口就是间接层的体现,架构设计中的各种模式和方法本质上都是间接层在不同的层次和场景中展现出的具体形态。

结语

以上东拉西扯的写了一堆,都只是一个芯片领域外行的胡思乱想,不过也算是对理解计算模型的一种尝试。《穷查理宝典》里讲到查理·芒格的多元思维模型,就是通过不断学习众多学科的知识来形成一个思维模型的复式框架,一方面对事物的理解更加深入和全面,另一方面也可以在不同的场景下,选择合适的模型去指导思考和实践。

你可能感兴趣的:(软件开发,fpga,asic,cpu)