为了能到远方,脚下的每一步都不能少.|

Max_Season

园龄:3年11个月粉丝:2关注:4

前沿讲座感想与未来规划

(本文内容为2022年春笔者在北航上的前沿技术讲座课程的大作业,包含了课程内容总结和未来规划)

从上世纪20年代哥德尔用对角线方法解决逻辑系统中的判定性问题和图灵提出他的图灵机理论开始到现在,计算机科学的发展已经走过了近百年的历史,但是时间并未使计算机科学变得暮气沉沉,相反,随着一项又一项重大技术的产生,它正在不停地超越自身,打破过去的常规,孕育出改变世界的力量,它的未来,恰如毛主席在《星星之火,可以燎原》中所写道的:“它是站在海岸遥望海中已经看得见桅杆尖头了的一只航船,它是立于高山之巅远看东方已见光芒四射喷薄欲出的一轮朝日,它是躁动于母腹中的快要成熟了的一个婴儿。”

从计算的效率谈起

每当人们提起计算机计算速度的提高,都会不约而同的提起上世纪所建造的第一台冯式架构的通用计算机--ENIAC,那是一台体积不亚于当今超算的计算机,尽管如此,它的计算速度仍低于当今的单片机(这样的对比是不公平的)。这种性能的巨大提高,要仰仗计算机科学中各个领域的专家学者对效率的不懈追求。这其中大致可以划分为三个领域:体系结构、编译器设计和操作系统。下面将分别对这三个领域中的发展做一些初步的介绍。

体系结构

通用处理器的困境

摩尔定律可谓是计算机领域中最为人所熟知的定律,人们往往因为这条定律对计算机的发展充满信心,非常遗憾的是,到了2018年,当下CPU的实际能力与它的预测结果相差了15倍(见下图)

CPU的频率和每周期指令数的增长一部分要归功于CPU架构的创新,其核心思想是指令级并行(ILP),同时很大一部分却要归功于工艺技术的不断提高,但如今工艺技术已趋于物理极限,工程师们寄希望于从提高单位面积上的晶体管数量来提高性能已逐渐变得不可能。但是正如之前所说的,人们对性能的追求是无止境的。如今,架构师们把视野转向多核设计,将如何识别和利用并行性的责任交给程序员和编程语言,在这个视角下,制约性能提高的关键从摩尔定律转变成了阿姆达尔定律,即取决于参与并行的CPU核数以及程序本身串行和并行的比例。

DSA的突破

在通用CPU性能改进受阻的同时,一种新的体系架构的设计出现了,那就是面向特定领域的体系架构(DSA),通过软硬件协同来更好的加速特定领域的计算问题,这其中包括图形加速单元(GPU)、用于深度学习的神经网络处理器(例如TPU)等。相比于通用处理器,DSA在各自的领域中使用了更为有效的并行方式,例如SIMD和VLIW等方式。同时,在特定领域中,DSA可以更有效的利用内存层次结构,由于通用处理器的代码在空间和时间上的局部性优化难以预测,在实际运行时,往往通过多级高速缓存来避免访问DRAM的延迟,但是这些多级高速缓存通常需要消耗大约一半的处理器能量。而在特定领域中,程序员和编译器可以更好的优化内存的使用。因此,DSA通常由用户来制定数据所使用的内存层次,对于适当的应用,其表现往往比直接使用高速缓存所用的能量更少。

DSL:面向特定领域的语言

DSA通过体系结构来支持高级运算,而DSL希望尽可能的描述程序中特定的结构和信息,因此DSL能够相对高效地编程DSA,例如DSL可以显式地指定向量、密集型矩阵和稀疏行矩阵运算,并允许编译器直接将运算映射到处理器上。DSL常见的例子有:面向矩阵运算的Matlab、面向DNN的数据流语言Tensorflow等。

开放式架构:处理器中的“Linux”

开放式架构的一个例子是RISC-V,它具有一下的特点:

  • 它是一个模块化指令集,一小部分指令是完整的开源软件堆栈,另一部分是可选的标准扩展,设计人员可根据需要来进行选用或忽略。RISC-V的软件堆栈包含了32位和64位的版本,它只能通过可选扩展来增长,同时这些扩展并不会影响到原先软件堆栈的运行。其中的标准扩展包括整型乘除法、原子内存操作、单/双精度浮点数和压缩指令。
  • 更少指令。相比起armV8,RISC-V的指令要少得多,其基础部分只有50条指令,其标准扩展增加了87条指令,一共137条指令。
  • 更少的指令格式。RISC-V的指令格式非常少,只有六种。
  • RISC-V是一种简洁的设计,避免了微架构或技术依赖的功能(如延迟分支和延迟加载)或创新(例如寄存器窗口),这些功能被编译器技术的进步所取代。

开放的架构使得可信赖的安全性成为可能,安全专家并不会相信不可见的安全性,因此通过开放性的架构来定制安全性成为一种非常有吸引力的选择。同时,由于RISC-V本身简单化的设计,安全性变得更容易检查。最后,架构师们可以通过FPGA的可塑性来在线部署和评估新颖的解决方案,以一周为单位进行快速迭代。

敏捷硬件开发

受益于软件工程领域中敏捷开发的启发和当代电子计算机辅助设计工具(ECAD)抽象水平的提高,硬件领域的敏捷开发成为可能。下图显示了硬件设计的各个层次。

在前三个层次上,设计者分别在软件模拟器、FPGA和ECAD上生成和验证他们的设计,图中的前四个层次都支持四周冲刺。

总结

2019年,对体系结构领域具有开创性贡献的两位学者John Hennessy和David Patterson发表了文章《计算机架构的新黄金时代》(本文在写作时也参考了该文章),其中对体系结构的历史和未来做了如下的总结:

登纳德缩放定律和摩尔定律的终结,以及标准微处理器性能提升的减速并非必须解决的问题,而是公认的事实。这一事实也提供了惊人的机会。高级、特定领域的语言和架构将架构师从专有指令集的链条中释放出来,公众也提高了对安全性的需求,所有这些将为计算机架构师带来一个新的黄金时代。借助开源生态系统,敏捷开发的芯片将展示其进步,从而加速商业应用。这些芯 片中通用处理器的 ISA 理念很可能是 RISC,后者经受住了时间的考验。我们期待着这次能与上一个黄金时代一样快速改善,不过这次是在成本、能源、安全以及性能方面的改善。
未来十年,将会有一场新计算机架构的寒武纪爆炸,这对业界和学界的架构师们来说将是激动人心的时刻。

从图灵和冯诺伊曼建立起通用计算机的理论基础开始,人们便踏上了体系结构设计这条没有终点的道路,或许在软硬件协同愈演愈烈、硬件设计成本逐渐降低的未来,特定领域加速器将越来越专用化直到面向即时编写的程序,它们将特定的计算任务加速到极致,直到受到物理极限的限制。

编译器设计

在编译器还未出现的年代里,程序员们往往在卡片上打孔来进行编程,卡片上打了孔和没打孔的区域分别代表0或1,通过这种方式,程序员将程序的机器码输入到计算机中运行。这种方式十分的耗费体力,同时也带来了调试程序的不方便。后来又出现了与机器码之间的映射关系十分简单但更为抽象的汇编代码,因此简化了编写程序的过程。尽管如此,人们对此并不满足,一个问题自然而然的产生了:能不能通过高级语言生成机器代码?在一开始这被认为是不可能的,John Backus带领的团队进行着复杂而艰苦的FORTRAN语言及其编译器的开发工作,但是一位语言领域的学者Noam Chomsky却有了意外的收获,他发现有一类文法中天然的存在一种递归的结构,也就是后来的上下文无关文法,相关领域的工作因此得到突破,最初的编译器也因此诞生。

编译器领域的经典项目

在紧接着的后来,人们发现编译器中的一部分可以自动化,其代表是Lex和Yacc的出现。同时,代码优化技术也在逐步发展,诸如数据流分析、ssa代码生成等技术被人们提出。值得指出的是,轰轰烈烈的开源软件运动也促进了编译器的开发,也就是影响深远的GCC项目。GCC通过自由软件和开放许可证,允许开发编译器的专家们互相合作,使得前端、优化器和后端分开设计,实现了软件内部的解耦,改变了编译器的行业格局。同时因为GCC有着最好的C++前端,所以一大批编译器工程师都在这个前端的代码库上进行改进,推动了创新和C++本身的发展。

编译器新秀:LLVM

继GCC后的又一革新是著名的LLVM项目,它的一个显著的创新是更激进的模块化设计,它颠覆了经典的“前端+优化器+后端”三段结构,LLVM是一系列库(library)的组合,LLVM代码库中,所有的代码都在lib目录下。这些库可以单独分离出来,与其他库组合搭配使用,也可以重复使用。例如它们可以和画面渲染引擎、数据库查询引擎相结合,LLVM既是一个优秀的C++编译器,也具有其他方面的更广泛的、更具创新性的用途。

LLVM的模块化设计使得其迭代开发变得更为可行,例如人们可以不理会其他模块,而集中全世界的专家来单独研究寄存器的分配模块,这改变了过去的合作方式,也大大地提高了扩展性。各个领域的专家往往都能从LLVM中得到启发,在已有的模块发展各自领域的专用技术而不是从头开始。

未来趋势:面向特定领域的编译器

在前文提到了摩尔定律失效的背景下,Patterson和Hennessey提出过一个结论:我们来到了计算机架构的文艺复兴时代,即需要把计算机行业上下流人员垂直整合起来,大家既要懂硬件,也要懂软件。原因是制造更快的通用处理器已经变得困难重重,一个解决方案是制造特定领域的处理器从而达到加速的目的,例如GPGPU、TPU等。随之而来的一个问题是:怎么对它们进行编程?这时,不同的公司开发了不同的工具,它们不协同,也不兼容。各个工具瞬息万变,造成了整体的混乱局面。这样的问题,在90年代时C编译器也遇到过。历史恰如人们所说是一个轮回,正如我们所知道的,GCC和LLVM的出现结束C编译器厂家各自为战的局面。那么,面向加速器的编译工具也需要类似的东西。

RISC-V+MLIR的解决方案

上文提到,RISC-V具有着开放性的架构,这种开放性的架构可以在构建加速器时被利用起来。由于人们为加速器所编写的内核越来越复杂,扩展性也随之下降,导致其无法适应厂商不断迭代的硬件功能。在这种情况下,自动生成内核的程序出现了,按照这样下去,一个编译器层就会逐渐出现。这不禁让人思考,真的有必要如此吗?加速器本身,应该与其解决的核心问题紧密相关,而不是把时间花在控制处理器的内核驱动和汇编程序以及复杂的多流管理小组上。有必要在编程模式、硬件等方面进行创新,发展出新的应用程序,推行标准化设计,通过标准化来快速完成工作。

在上世纪60年代,IBM公司同时拥有着4种相互不兼容的计算机结构。为结束这种碎片化的情况,IBM推出了IBM360指令集,至今仍在使用。如今的RISC-V,则是类似的一个选择,它是一个模块化的指令集,架构师们可以选择定制指令集,如果你不需要浮点运算,可以选择不加入相应的浮点运算指令。同时,RISC-V还提供了运行在这个指令集上面的整个软件世界,因此,你还可以得到C编译器和Linux。通过RISC-V,人们还可以一次性地在构建加速器的同时生成相应的加速器内核甚至是C编译器、GDB和LLDB。进一步的,还会遇到分层并行计算问题,即多机器,多芯片和多核之间的并行,这种情况下如何进行编程?一个解决方案是MLIR,其全称是“多级中间表示”,它是一个元编译器,即“编译器的编译器”,支持构建分层编译器。值得指出的是,MLIR是LLVM技术家族的一员,它继承了LLVM的设计方法和设计理念,具有模块化和可扩展性,被广泛的应用于CPU代码生成和GPU、机器学习等领域。最重要的是,它开始统一异构计算的世界,重复使用更多技术,避免重复造轮子,使人们得以专注于技术堆栈中全新的部分。

操作系统

(限于篇幅这里就不展开太多了)

我对操作系统的理解是,它解决了大量计算机领域中的核心问题,诸如内存管理、进程调度、文件系统和IO,在解决的过程中,人们提出了一系列的思想方法和创新技术。这让我想起一位数学家称费马猜想是数学领域中的一只会下金蛋的母鸡,因为对它的研究使得数学家们提出了一个又一个的思想方法和数学工具。同理,操作系统的开发也是计算机领域中的会下金蛋的母鸡。每当人们在开发一个新项目的过程中遇到问题时,往往通过适当的抽象,就可以与操作系统中的某个模块所解决的问题对应起来,获得过去经验的帮助。

基础设计:宏内核 v.s. 微内核

宏内核设计中一般将操作系统的核心功能在内核空间实现,用户通过调用系统接口来获得服务时,将陷入内核态中。而微内核则将核心功能分模块用进程来实现,用户进程调用系统接口时,会用IPC机制来通知相应的系统进程获得服务,然后通过IPC机制获得结果。

大部分类Unix的操作系统都采用了宏内核设计,包括著名的Linux,而微内核的著名例子是Windows。微内核和宏内核的差别在历史上有过一场著名的争论(见https://www.oreilly.com/openbook/opensources/book/appa.html),即Tanenbaum的minix和Linus的Linux之争,现在开来,宏内核的Linux在商业化上获得了巨大的成功,而minix则依然作为教学用的操作系统存在,令人感慨。

个人规划

通过前沿讲座了解了非常多计算机学科的前沿知识,我深刻的感受到计算机行业当今蓬勃向上的活力,同时,由于摩尔定律的终结,过去那个“古典计算机”时代已经过去,程序的并行性能将越来越被重视。基于此的各种异构计算、分布式计算、云计算将迎来一波发展的高潮。这波浪潮将席卷计算机的每个领域,进而影响整个世界的科技发展格局。身处其中的我不禁思考应当何去何从。未来的一段时间,我将尝试了解并学习分布式计算的知识,力求在这方面有所了解,同时,由于各方面原因,我打算在本科毕业后就直接就业,力求进入互联网公司。努力学习技术,争取成为一名高级架构师。

本文作者:Max_Season

本文链接:https://www.cnblogs.com/maxorao/p/16290209.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Max_Season  阅读(227)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起