大家常常听到计算机,有软件,有硬件,你愿意学软件还是愿意学硬件,有什么区别呢?硬件和软件之间有一个指令集,这个指令集定义了软件和硬件的界面,定义一些最基本的操作。一般一个计算机大概有几十个,甚至上百个指令,这些是最基本的机器的指令。你写的程序分解成各种各样的指令。做硬件,就是做一个最好的计算机,执行这些指令。软件也是把你的程序分解成最基本的这些指令,不过,现在这个指令也造成了很大的问题。
计算的时候有上百个指令,其实在早期没有多少计算元件,你要执行这么多指令怎么办?我们就用同一个数据通道,同一个计算单元执行所有的指令。指令进来之后我先分析一下是什么指令,我按照你指令的需求把我的开关重新设置一下,这样我来执行这个指令,这个执行完了,数据存了以后再执行下一个指令。所以,简单的一个指令要经过几个步骤:从获取指令,解码看一下是什么指令,进行计算,最后把数据存起来,是这么一个循环往复的过程。
摩尔定律是摩尔(Gordon Moore)1965年有一个预测,他看了英特尔做的几个芯片,他觉得18到24个月可以把晶体管的个数翻一番。当时他看的只是几个数据,没想到这么一个简单的预言成真了,下面几十年一直按这个节奏往前走。这真是一个了不起的事情,每次翻一番大家知道是指数型的发展。
摩尔定律已经50多年了,现在还在继续,为什么呢?
是因为我们把晶体管不停地做小,否则同样的大小,你的计算机已经把整个科技馆都占了还不止。每过18到26个月,每个晶体管比原来小了70%左右,这是非常可怕的。给大家一个概念,不知道大家有没有玩过俄国的套娃,很有意思,你打开她以后里面又有一个小娃娃,据说最大的里面有50多层套着。
我女儿跟我前几个星期坐着波尔地海游轮到俄国,买了个十层的娃娃,每个我算了一下差不多70%,经过十次以后,这个娃娃小到你基本上看不到了,所以为什么能集成度这么高,是因为晶体管越做越小。现在大概做到只是20纳米。你今天应该很自豪,在你的兜里装了一个有几十亿晶体管,每个都有20纳米的这么一个先进的仪器。
我们不但可以把它做得小,晶体管的速度也越来越快,而且是指数型的增长。
有些同仁可能有点失望,我为什么要听你讲,这种好事已经发生了50多年了。这确实是个很重要的问题,所有的好事都要结束了。到了2000年前后都是这样的,晶体管越来越小,而且越来越快。但是到2000年前后发生问题了,发现晶体管可以做得越来越小,但是芯片的温度越来越高,如果我不做任何的事情,我让计算的频率增快,就要接近原子能发电站的温度了,要接近火箭口或太阳表面的温度了。这是不可能的!
今天你拿着你的笔记本搁在腿上比较烫,都比较紧张,如果到了温度到了火箭口的温度,你是不可能接受的。我不讲具体的原因,其实是因为我们的电压不能指数级的下降,原来之所以晶体管可以能耗越来越小,是因为在把它变小的同时把电压也降下来了。一定时候电压降不下来了,所以晶体管的能耗,芯片的能耗就越来越高了。
怎么办呢?今天不管花多少钱,你的主频超不过2到4赫兹,但是你确实可以买到多核的计算机。一个英特尔芯片有8核,你稍微看一下集成电路的芯片就很明显,原来每一个核都是一个单独的计算器,现在全给集成在里面了,虽然说每个晶体管的速度没有提高,但是晶体管多了以后计算还是快了很多。
中国有全世界最快的超算计算机,最近叫“神威太湖之光”,芯片全是国产的芯片。“太湖之光”用了多核的计算,每个里面有256个芯片,若干个芯片迭代起来搭了一个超大的计算机,现在是全球最大的计算机。有一个公司,他们做深度学习用了图形加速器,现在最新的GPU有3600个芯片,虽然说速度没有增加,但是里面集成度还是在增加。这里可以看出,摩尔定律是集成度不停地增加,速度和并行在不停地提高。
你可能要问了,到最后有什么问题要解决?其实还是有不少问题的。第一个,摩尔定律像所有的聚会一样都是有聚有散的,你今天花钱买到的电子元件大概是22纳米到16纳米的晶体管,这已经是最超前的了。如果你是苹果手机,是5和6是到不了,如果是苹果7是在这么一个区间。你有一个16到22纳米的元件已经是非常非常不可思议的事情,这么小的元件是怎么制造,怎么把它切出来?我们今天最快的刀不知道比它厚多少倍。
最锋利的刀是激光。激光的波长是193纳米,我用一个大概200纳米的刀去切除一个20纳米的晶体管,所以这是很不容易的一个事情。就像写书法,我让你用一厘米粗的笔给我写出一毫米小的字,可不可以写呢?可以,但是不容易。我们往下能走多少呢,我不知道了。有人告诉我说是7纳米、5纳米、3纳米,我取个中间值5纳米,到这里可能就要截止了,因为有工艺上的原因,有价格上的原因。
这个就有意思了,如果这个结束了怎么办,计算的能力能不能接着提高?
我们一直在思考这个问题,即使在2007、2008年的时候离摩尔定律的终点还有不少距离的时候。我们提了这么一个想法,以后的计算不应该简单的并行,而且要定制化。我们给美国自然科学基金会送了一个提案,未来的计算叫定制计算(Customized Computing)。
我们挺幸运的,这个提案被接收了,我们得到了1000万美元做这样一个很大的研究项目。前面若干年我们一直在做这方面的工作。我简单讲一下,为什么定制计算有这么大的作用。
这张表是UCLA(加州大学洛杉矶分校)教授十多年前做的一个研究,比较通用计算和专用计算之间的区别。他选了一个应用,实现一个加密算法AES。
你想买东西但同时不想信用卡的号被别人一下子拿到,那就加密以后送过去那边再解密,加密解密是我们常做的事情。加密的算法,首先做了一个特殊的芯片来实现,每秒钟能加密多少比特,用了多少功耗,单位功耗可以加密多少个比特,作为一个参考值。这是一个专用的芯片,这个事不能干别的,只能做加密这个事情。他同时又用了一个低功耗的CPU,他用通用的CPU做,这么一来就差了85倍。
他用了一个高性能的计算机,英特尔公司的,差了800倍。另外,如果用JAVA在通用计算机上来算,就差了300倍。通用和专用中间有很大的区别,如果我们能把专用芯片的优势发挥起来,计算能力又能提高上百倍甚至更多,这是我们想做的工作之一。
你可能会问,计算机做了这么多年,怎么这么没有效率,跟专用芯片一比就差了几十倍,甚至几百倍,为什么呢?
因为计算机今天的结构都是沿用了50年代的结构,当时没有那么多计算元件,我用同一个元件执行各种各样的指令,所以这个流水线就很长。我们计算了一下,这个流水线每一步的能耗。我们知道,要先把指令取来,再分析一下,再把数据取来做计算,再搁回去。
你可以看一下具体的,光取指令大概就有7%的能耗,或者8%的能耗,你再来解码一下,看看是什么样的指令,又花了6%,接下来可能有一些重新命名的指令,把名字更改一下要花12%,也可能其中一个数据,现在还没有计算出来,要等一下,需要一个调度的过程,又要花11%,所以这个流水线非常复杂。正经有用的,做个加法,或者做个乘法,这些很简单的数字或者逻辑计算,都要很多消耗。
为了通用,处理器不是那么有效,这是我们今天为什么有这么多提升空间的原因。
我们该怎么做呢?我们的提议是,不要用通用的处理器,用各种各样的加速器,加速器是不能干太多的事,但是能够把一件事干得特别好。我们有一个提议,你要有很多的,或者是专用的,或者是可组合的加速器,把它搁在一起,绝大多数计算都应该在加速器上实现,而不是在处理器上。
刚才我举了例子,加密要用一个加密的加速器实现,它的效率有几十倍、几百倍的提高。你可能说,为什么你现在提这么个概念,以前不用这个办法呢?这也是一个很好的问题,因为以前我们没有那么多的晶体管,我不可能做这么多的加速器,因为我要做这么多加速器,我芯片里就搁不下了。今天是完全不一样的问题。我们每个人手里都有几十亿晶体管的芯片,非常庞大,困难的是没有足够的功耗支持,所以是完全不同的问题。
早期的计算机要通用,因为没有那么多元件,算下来有几百个,几千个,几万个,今天有几亿个,几十亿个甚至上百亿个,所以要专用,这就是区别。
还有一个启示,我们看一下自然界的发展,一个是看看我们自己的人脑。人脑很有意思,我跟一些搞神经科学的专家有过探讨。我说你告诉我,我们怎么做计算?有没有这么一个流水线在那执行指令,一个接一个的,他说我们没找到。
但是确实我们看到脑子里有各种各样的区域,有的区域是管情绪的,有的区域是管语言的,有的区域是管图像识别的,而且管语言的还挺复杂,有时候管中文,有时候管英文的。确实有一个例子,一个人本来能同时讲中文和英文,后来有了创伤,他不能讲中文,能讲英文,说明他各个区域是管不同的事,所以这是我们人脑的有效性,因为有各种各样的加速器,把计算做得非常有效。我们的大脑大概是一个最暗的电灯,20瓦的耗电就可以干这么多事。
另外,社会发展也是同样的道理。早期我们的祖先都是在打猎,后来慢慢就有分工了,到现在的社会就有医生、律师、教授、计算机科学家。现在的社会分工也是非常明确的,这也提高了计算的有效性。
怎么做这样一个可以定制的芯片?其实有不少的例子。有一个比较有效的芯片,我们一直用的叫FPGA(field-programmable gate array,现场可编程逻辑阵列)。
这里面有一些可定制的逻辑,而且有各种各样的存储器,还有可编程的互联。这就是一个很神奇的芯片,你可以买回来搁在你家里或者书桌上,你可以不停地改写成各种各样的芯片,做各种各样的事情。你说这个怎么可能,为什么能有这样的?其实原理很简单,他有一个查值表,还有一个传输的晶体管和多路选择器,决定怎么做互联。互联的时候可以让你走,可以不让你走。
我选哪个输入,哪个输出,通过一个查值表,可以把各种各样的功能都实现了。这个听起来有点玄乎,你说怎么能有这么神奇的东西,有一个查值表,可以把世界上所有逻辑的函数都实现了呢?其实不难。我们小时候做乘法的时候,很多时候不会做乘法,就会背一个九九表,这个表实际上定义了乘法运算。如果我把这个表改一下,三三得九,我把它改成六,我就是在做加法运算,但是我不能只改这一个地方,我要把整个表改了,这个表可以定义加法。
我可以改成更复杂的,比如我定义成(A×B)-(A+B),如果我把这个表全都改成这样一个东西,这个表实际上就实现了这么一个比较复杂的函数。通过这样一个查值表,我可以实现各种各样的函数。有了这个之后我可以用它做各种各样的计算。其中有一个例子我们最近做的比较成功,加速DNA的测序。这是大家很感兴趣的问题,精准医疗。
原来我去看病,老中医号号脉,我也不知道他怎么算出来的,拿给我24副中药,现在最起码在西方是精准医疗,和DNA测序有关的。你跟我都有30亿个DNA的碱基序列,这个每个人都不太一样,完全是因人而异。按照这个序列有什么样的特性,决定用什么药,甚至有人不幸得了癌症,可能因为突变,也是根据突变决定用什么药。
测序过程非常复杂,测序测出来,不能一下子测出30亿个序列,只能一次测一百个,他测了一大堆很短的序列,我们的任务是要把这些序列组合起来。像小时候我们玩的一个拼图游戏,有50个片,要把那些小片片拼出来。把整个序列找出来,这是计算量非常之大的工作,你可以看出来测序一出来之后,大概有300到500个GB(1GB等于十的九次方)。
我有一个30亿的参考序列,你跟我可能有点不太一样,所以你要再重新排一下,看出有什么区别。数据量之大,计算量也非常之大。我们把这个做到FPGA上,每个单元做这个事情,把序列做比较,算出差异。我们组织起来有两个层次,有第一个阵列还有若干阵列,最后我跟最先进的测序的仪器结合在一起,这个效率还是蛮高的。现在是多核的程序,跟一个核的处理器比,我们大概提高了300多倍计算的速度。
今天市场上买到是多核的处理器,即使跟24核处理器比我们也有3倍的提高。我们用可编程的技术做成一个专用的芯片,这个芯片不能干别的事,只能做DNA排序,但是排出来之后比通用计算机做出来的效率高很多。我们有一个个性化定制的癌症突变治疗,癌症开始了以后有突变,突变以后你要找到对症下药,这方面有很重大的突破。小时候我们看电视据说一个人得了白血病肯定就不行了,但是其中有20%的白血病,今天基本上百分之百治愈。
办法就是找到药把突变的一点卡住了,癌细胞就不能复制了,对那一类白血病非常有用。
我跟做那个方面的科学家聊过,癌细胞也很聪明,你把这一块卡住,我就变变变,别的地方出来,这是一个猫捉老鼠的游戏。这个药做得比较快,我们有这么一个过程,不是用一个处理器,可以用一堆处理器。另外,还有一些癌症我们不知道是哪个基因突变,不是拿一个基因,要拿上千的基因。
刚开始做基因测序的时候,光是计算这一步,用最快的英特尔处理器要用170个小时,170个小时基本上是一个星期,这还是速度很慢的,现在基本上可以加速到4、5个小时,像验血一样,当天就可以知道结果。
说到这一点,可能有的同学就想这个技术太有意思了,我要用到它,要用它必须解决一个问题,怎么设计?刚才我讲到今天的设计就是你写软件,把它分解成指令集,在硬件上执行。
你现在有了FPGA,有成千上万的逻辑单元,指令集在哪儿?其实是没有指令集。把一个很复杂的计算分解成各种各样的运算,逻辑的单元在这上面能进行运算,这是一个非常困难的事情。写软件的你或者用C,用C++或者JAVA,写硬件的就是凤毛麟角了。我们做了这么一个工作,设计FPGA太难了,让可以写软件的人自动设计FPGA。我们用自动编辑原理,做了一个编译系统,你从传统的软件开始,我们生成硬件的描述语言。
这个还是很成功的,工业界不少人用这个东西。我们成立一个创业公司AutoESL,有不少公司用这个公司的产品。谷歌有一个很好的功能,可以查一查所有的论文有哪些在应用这个词,我们查了一下,光论文有1700个,所以工业界还是非常普遍地运用了这个技术。
但是,我们设计这个工具的时候,十年前的出发点是考虑让芯片的设计者更容易一些,他不用写这么繁琐的硬件描述语言,只需要写软件。
但是今天我们想让他做计算还是不够的,因为计算时候必须把处理器、CPU和FPGA同时用到,我有一个新的软件开发了CMOST,其中你给我一个程序,我决定哪一部分在硬件,哪一部分在软件,数据怎么传输,怎么共享内存,有一系列的工作。这个工作也做得很不错,不但学术界认可,我们很多工业界的朋友也想用。我们又成立另外一家创业公司。
这是很有效的软件,你就写C程序,进来以后自动一部分搁在CPU运行,一部分搁在处理器上运行,给你很大的加速。现在大家听到很多的词如深度学习。深度学习可以干的事还真不少,比如我的中文虽说得不那么好,尤其中文字忘了很多,但是我手机微信上还可以回中文,完全是靠语音识别。我跟微信讲,我今天下午4点钟会议结束,他就会打出中文来,这个语音识别的过程全是用深度学习的技术。图像识别,也是用深度学习。
深度学习是什么技术,其实用了多层的神经网络,这个神经网络里面做的是卷积的计算,你进来之后,第一副图像很简单,RGB,但是我在里面再做一个卷积,提取更多特征的值出来,我一层一层提取,做卷积,除了做卷积还有别的逻辑运算,取一个最大值,或者在最后再做一个分类。
这个事情你也可以用计算机做,但是用计算机做不太有效,这个事情既然你那么常用——我们不停做语音识别,不停做图像识别,我们想可以用FPGA可以做一个加速的芯片。今天用软件描述一下你想做的神经网络,这个神经网络有多个层次,每个层次有多少个神经源,讲清楚之后,我们给你自动生成脉冲阵列。这里有一个很有意思的特点,我只需要跟我的左右手的人互相通信息,这是很不容易的。
今天如果要打电话给很远的朋友或者亲戚,能不能跟你邻接的人通讯就可以把这个事情干成?我们做出来一个芯片,只需要把你邻接的人交换信息就可以把数据传递。这个芯片有很多优良的特点,能耗、计算速度都会有提高。我们做出来以后跟最好的处理器结合,我们的速度可以提高46倍,功率可以降低2倍,能耗降低了100多倍,这又是一个很好的例子,通用和专用的区别。这个专用其实还有人可以做得更好,你可以设计一个专用的芯片。
但是我们这个是用FPGA做出来的,你还可以改变它的功能。
FPGA也不是唯一的可以用来加速的元件,我们在加州大学洛杉矶分校还做了别的工作,我们用了可重组的加速器做新的处理器。
这里我有很多可以加速的单元,这个单元要比我刚才讲的查值表要复杂很多,我可以用互联的交互性连起来,你需要什么样的,比如要做一个开根号的运算,或者除法的运算,我们可以把一些加速单元组合起来做这个事情,我们可以在医学成像加速上有很大的提高,大概几十倍,上百倍的提高,而且有足够多的灵活性,用于不同的应用。
如果你有一些加速单元,如果忘了一些很重要的加速单元怎么办,那也没关系,我们这里又加了一些细腻度很高的可编程软件,像FPGA元件一样,你可以通过它生成我们需要的加速单元,这样可以做进一步的计算。
值得一提的是,2014年IBM公司做了一个神经网络加速器,这个神经网络跟我刚才说的卷积计算不一样,卷积计算是人工智能的办法。
我不觉得我们脑子在不停地做卷积计算,如果不停地做卷积计算两分钟以后就摔倒了,能耗就用完了。IBM的结果有点像我们大脑里的神经网络的计算,以脉冲形式的,看到信号才发一个脉冲,有这个脉冲才可以激活若干个神经单元,不是每一个使用段都在不停做计算,所以它的能耗非常低,只有20个微瓦,而且它的集成度很高,4.5万个晶体管在芯片上,所以是一个很好的加速器。
有一个很重要的问题,各种各样的加速器,哪个加速器更好?说到各种各样的加速器,我觉得很重要的一点就是我做完了之后可以重新用在别的应用上,也可能我刚开始的想法不够完善,刚开始的软件不够精炼,但是我可以用来做各种各样的事情。
我想对刚要开始科学生涯的同学们说一下,你并不是生不逢时,有各种各样的机会可以做。第一个,可定制的,可重构的体系结构,可以用来做各种各样的加速器。
我没讲的,其实我们也做过很多应用,今天的集成电路都是二维的,逻辑都是搁在一个平面上,互联可能有若干层,但是我们十多年前做过很多的考虑,比如三维的电路。我刚才提到了一点,IBM的芯片,那个性能还是非常惊人的,我们能不能做成一个类脑芯片,跟我们脑子结构和工作原理比较接近的,那个绝对不是我们今天说的FPGA,我觉得应该是别的体系结构。
再扯得远一点,大家也听到一个词“量子计算”,量子计算提供了非常诱人的选择。我欢迎所有的同学们来到一个新的计算新纪元。