jjone 2007-12-2 17:02
计算基础正在发生根本变革——解读“计算2.0”
[font=宋体]从本质上看,软件实际上只是夹在人与硬件之间的一个中间层,人们使用软件的根本目的还是要让硬件运转起来为自己服务。硬件平台如果长期稳定,软件就能够安稳发展,建起高楼大厦,硬件基础如果打个喷嚏,软件就会得一场感冒。过去十几年来,我们的计算环境已经发生了很多变化,比如[/font]RISC[font=宋体]的兴起,大规模服务器集群的发展,[/font]SIMD[font=宋体]的普及,特别是网络的大发展,令人印象深刻。每一项变化都给软件带来一定程度的冲击。不过大部分情况下,这种冲击力度有限:只需要有一小部分人去关注就好了,他们会尽可能把这些变化包装起来,从而使得其余的绝大部分人不受影响,而又能够享受硬件发展带来的免费午餐。比如说,[/font]RISC[font=宋体]跟硬件平台带来的变革是非常巨大的,但是只有编译器和操作系统开发者真正需要关注它。[/font]SIMD[font=宋体]([/font]MMX[font=宋体]、[/font]3DNow![font=宋体]、[/font]SSEx[font=宋体])的发展使普通计算机处理多媒体数据的能力获得了本质提升,但是厂商们也推出了一系列封装库,使应用软件开发者们在不需对开发方式做重大改变的情况下享受这些发展成果。[/font]
[font=宋体]然而站在今天这个时间点上往前看,就会看到,情况在发生的变化。发生在若干个不同领域的硬件进展,几乎在同时达到了可以被称之为“本质变化”的状态。而所有这些变化结合起来,则使我们面对一个自[/font]1980[font=宋体]年代初[/font]PC[font=宋体]崛起以来从来没有过的局面,一个可以毫不夸张地称之为“变革”的局面,我们称之为“计算[/font]2.0[font=宋体]”[/font][font=宋体]。在“计算[/font]2.0[font=宋体]”[/font][font=宋体]的时代里,软件开发者面对的平台会发生巨大的变化,而且这些变化很多是非常本质的,无法简单地使用“包装”的手段屏蔽掉,从而要求软件开发的实践也必将随之发生巨大的变化。这对软件产业的每一个人来说,是历史上很少会遇到的情况,给我们带来巨大的挑战和机遇。[/font]
[font=宋体]下面就让我们一起来展望一下“计算[/font]2.0[font=宋体]”[/font][font=宋体]将给我们带来的冲击。[/font]
1. [font=黑体]多核与并发编程[/font][url=http://blog.csdn.net/myan/archive/2007/11/28/1905394.aspx#_ftn1]<!--[if !supportFootnotes]-->[b][font=Arial][size=16pt][1][/size][/font][/b]<!--[endif]-->[/url][font=宋体]自从[/font]2005[font=宋体]年初[/font]C++[font=宋体]标准委员会主席[/font]Herb Sutter[font=宋体]发表《并发的革命——免费午餐已经结束》的著名文章以来,多核已经成为整个软件社群里热门话题。在那篇文章里,[/font]Herb Sutter[font=宋体]断言说,[/font]CPU[font=宋体]频率的提高已经接近极限,摩尔定律的发展今后将依赖多核化进行下去,因此,软件若要在未来的环境下生存,必须考虑并发问题。接着,[/font]Herb Sutter[font=宋体]做出了更大胆和更惊人的语言,那就是不存在解决多核编程问题的银弹,不存在可以简单地将并发编程问题化解掉的工具,开发高性能的并行程序必须要求开发者从根本上改变其编程方法。从某种意义上来说,这不仅仅是要改变[/font]50[font=宋体]年来顺序程序设计的工艺传统,而且是要改变数百万年来人类顺序化思考问题的习惯,其困难程度可想而知![/font]
[font=宋体]将近[/font]3[font=宋体]年后的今天,[/font]Herb Sutter[font=宋体]的预言似乎初步得到了印证。单核机器现在已经成了过时货,并且很快就会加入古董的行列。而多核机器的价格正在迅速下降。如今花[/font]2[font=宋体]万块钱人民币,可以买下“三个[/font]8[font=宋体]”的刀片服务器——两个[/font]4[font=宋体]核至强[/font]+8G[font=宋体]内存[/font]+[font=宋体]四块[/font]200G[font=宋体]硬盘。再过一段时间,这个配置中的每项数据都会翻番。如果说在双核时代我们还可以假装一切都没有发生,那么当一台机器上出现[/font]16[font=宋体]个核的时候,敢于去忽略这种体系结构上的根本变革的人,一定是疯子。[/font]
[font=宋体]人们正在紧张地寻找着解决多核编程难题的方法。到目前为止,进展不太大。目前最理想的结果,就是类似[/font]Intel C++[font=宋体]和[/font]Intel Fortran[font=宋体]这样的编译器,可以自动识别可并行化的循环运算,然后实施自动并行化。但是这距离全面并发还很遥远。类似[/font]MPI[font=宋体]和[/font]OpenMP[font=宋体]这样的解决方案虽然早就存在,但是要得到普及难度不小。至于其他的一些常规方案,无非是优化多线程中的一些问题,比如无锁数据结构尝试避免加锁和解锁带来的巨大开销,而事务型内存也是为了优化多线程程序共享资源的性能和可靠性。专门为并发系统设计的语言[/font]Erlang[font=宋体],被很多人视为多核时代的[/font]Java[font=宋体],但是[/font]Erlang[font=宋体]的长项在于并发任务的分发和同步,用它来处理计算密集型的任务,如图形图像多媒体处理和数值计算,效率之低令人无法接受。也许把[/font]Erlang[font=宋体]当成计算的[/font]dispatcher[font=宋体],而让每个核上都继续以传统的单线程方式运行[/font]C[font=宋体]程序是解决这类问题的办法。但是所有这些方法,都首先要求将任务分解成可同时并行的多个单元,并且将并行计算中的若干问题定义清楚。也就是说,这些方法都无法解决那个最大的挑战:人的思维方式转变问题。不改变我们编写应用程序的传统线性思维,所有这些工具都没有太大帮助。毫无疑问,这是摆在我们面前的最大难题之一。[/font]
2. [font=黑体]新计算设备[/font]
[font=宋体]写作此文时,[/font]Amazon[font=宋体]刚刚发布了电子书阅读器[/font]Kindle[font=宋体],这款产品的出现,基本上等于宣告电子阅读时代的降临,它所将引起的冲击必将是划时代的。然而对于开发者来说,它却只不过是在一个已经很长的新计算设备名单里又加上了一项。这个名单中包括:[/font]PS2/3[font=宋体],[/font]XBox/XBox360[font=宋体],[/font]Wii[font=宋体],[/font] Tivo[font=宋体],[/font]Game Boy[font=宋体]、[/font]Game Boy Advance[font=宋体],[/font]PSP[font=宋体],[/font]iPhone[font=宋体],[/font]Windows Mobile[font=宋体],[/font]Symbian[font=宋体],[/font]Linux Mobile[font=宋体],[/font]Blackberry[font=宋体],[/font]iPod[font=宋体],车载导航仪,当然,还有最最激动人心的机器人。有人大而化之将它们统称为“嵌入式设备”,然而这是一个非常具有误导性的说法,这些设备中的每一项都不是传统意义上的“嵌入式设备”,而是更接近于计算机的通用计算设备,更确切的说法应该是“专用的通用计算设备”。[/font]
[font=宋体]仅仅十几年以前,我们可以安全地认为,世界上每台计算机都是[/font]PC[font=宋体],每台[/font]PC[font=宋体]都用[/font]X86 CPU[font=宋体],都安装了[/font]DOS/Windows[font=宋体]。随着最近几年来新的计算设备如雨后春笋般涌现,[/font]PC[font=宋体]包打天下的时代已经一去不返,这一点已经非常清楚不过了。[/font]
[font=宋体]然而,软件开发者并没有从过去[/font]20[font=宋体]多年形成的单一平台迷思中摆脱出来。在软件系统开发中合理运用多平台特长,充分注重可移植性的思维尚未形成,大部分应用还是为传统[/font]PC[font=宋体]平台开发的。这一点显然已经落后于时代的发展。当然,这也就给那些有识之士提供了难得的机遇,充分利用多平台整合的优势,就可以开发出革命性的新型应用。[/font]
3. GPGPU[font=宋体]“[/font]CPU[font=宋体]——中心处理单元,计算机的核心和大脑,一切的一切的主宰。”[/font]
[font=宋体]教科书上这么告诉我们。[/font]
[font=宋体]很遗憾,这种说法早就不是事实了。自从类似[/font]DMA[font=宋体]这样的技术出现,[/font]CPU[font=宋体]就在不断地“减负”。事实上一台计算机里有许多块不同的芯片,它们各自有各自的绝活,让整台计算机高速运转。不过,不管怎么说,[/font]CPU[font=宋体]还是整台电脑里最强有力的中心,它最强大,最能干。对吗?[/font]
[font=宋体]很遗憾,连这个说法也变得非常脆弱了。在那些装备有高级图形卡的电脑玩家的机器中,[/font]CPU[font=宋体]已经不是最强大的计算单元了,取而代之的是[/font]GPU[font=宋体]。[/font]
GPU[font=宋体]原本只是为了进行[/font]3D[font=宋体]图形加速而诞生的芯片,由于其专用性,体系结构较之[/font]CPU[font=宋体]大大简化,从而可以高度优化设计,进行大规模的浮点数并行计算。当代[/font]GPU[font=宋体]在这方面的性能远远超过了[/font]CPU[font=宋体]。在浮点数计算速度上,[/font]NVIDIA[font=宋体]最新的[/font]GPU[font=宋体]超过[/font]Intel[font=宋体]最快的[/font]CPU[font=宋体]达[/font]10[font=宋体]倍以上,而据称,这一差距在未来几年内会达到数百倍。单就这一点来说,[/font]GPU[font=宋体]早就是计算机中最快的芯片了。[/font]
[font=宋体]然而,由于[/font]GPU[font=宋体]的专用性,大部分通用计算任务是无法用[/font]GPU[font=宋体]来完成的。例如,连最最简单的分支语句,[/font]GPU[font=宋体]都无法完成。因此,[/font]GPU[font=宋体]永远不可能取代[/font]CPU[font=宋体]。但是,[/font]GPU[font=宋体]强大的计算能力如果仅仅给高性能图形程序和游戏来使用,也无疑是一种巨大的计算资源浪费,有没有可能将[/font]GPU[font=宋体]的计算资源暴露给应用程序员,由他们将适合于[/font]GPU[font=宋体]计算的任务转交给[/font]GPU[font=宋体]完成,而把[/font]CPU[font=宋体]解放出来干[/font]CPU[font=宋体]擅长的工作呢?没错,这就是通用[/font]GPU[font=宋体]计算([/font]General Purpose GPU computing[font=宋体])的宗旨。[/font]
[font=宋体]眼下,[/font]NVIDIA[font=宋体]和[/font]AMD[font=宋体](不久前收购[/font]ATI[font=宋体])都在加速推出对[/font]GPGPU[font=宋体]开发的支持,而据传[/font]Intel[font=宋体]也将在[/font]2008[font=宋体]年推出自己的独立显卡,加入战局。这也就意味着,不出几年,每台电脑里都会存在两个强大的计算单元,一个是[/font]CPU[font=宋体],一个是[/font]GPU[font=宋体]。软件开发人员将面临新的挑战——只有把任务合理地分配给[/font]CPU[font=宋体]和[/font]GPU[font=宋体],并且进行统一调度,才能够达到效率上的最佳化。此外,那时候的[/font]CPU[font=宋体]有[/font]8[font=宋体]个或更多的核,而[/font]GPU[font=宋体]本身更是高度并行化的计算单元,计算任务不仅要合理分布,还需要充分并行,这其中蕴含的挑战之大,足够令人心惊胆寒。然而,也正正创造了英雄横空出世的条件,谁能够横刀立马,谁就能功成名就。[/font]
4. [font=黑体]无处不在的网络[/font][font=宋体]回到[/font]Kindle[font=宋体],这个产品最有趣的部分在于,你可以随时通过无线网络下载你想看的书,而且这些下载的书被保存在网络上你的一个私人空间里。你永远不会买不到想要的书,也永远不用担心家里太小,放不下这些书。如果你的[/font]Kindle[font=宋体]丢失了或者你想换一台,没关系,你庞大的图书馆会毫发无损。[/font]
[font=宋体]你觉得怎么样?非常好,对吗?但这需要一个条件,一个重要的条件——无所不在的网络,特别的,无所不在的无线网络。[/font]
[font=宋体]不出几年,将不会再存在[/font]Internet[font=宋体]的死角,在任何地方你都可以高速访问[/font]Internet[font=宋体]。对软件开发者来说这意味着什么?这意味着很多过去惯用的软件设计思路将不再是最优的了,关于网络访问限制的很多担忧也变得不必要了。应用可以保证永远连网,用户数据也最好保存在网络上,密集的计算任务交给网络上的高速节点来执行,可能比本地执行更快。一言以蔽之,网络计算将全面取代单机计算,无论是对[/font]PC[font=宋体]来说,还是对各种各样的小设备来说。[/font]
[font=宋体]更重大的变化可能来自人们的生活方式,当互联网——这个目前世界上规模最大、最自由的网络——无处不在并且速度飞快的时候,其他的通信网络还有存在的必要吗?我们还需要使用中国移动的专有网络并且每个月为之付出不菲的费用吗?我们还需要忍受诸如“脑白金”那样的烂广告和矫揉造作的烂主持人吗?我们还需要买日报和杂志吗?可能都不需要了。互联网就是电视,互联网就是电话,互联网就是报纸,一切媒体归于互联网。这种局面会给人类的生存方式带来一个重大的变革,在其中蕴含着巨大机会、挑战和财富。在这个意义上,[/font]Google[font=宋体]的成功只不过是一个序曲而已。[/font]
[font=宋体]如上所述,相信您已经意识到我们处在一个怎样的变革当中!令我们兴奋不已的是,软件开发者在这个变革中处于前锋的位置,我们准备好了吗?[/font]
<!--[if !supportFootnotes]-->
<!--[endif]--> [url=http://blog.csdn.net/myan/archive/2007/11/28/1905394.aspx#_ftnref1]<!--[if !supportFootnotes]-->[size=9pt][1][/size]<!--[endif]-->[/url]
[font=宋体]在多核[/font]CPU[font=宋体]上的多线程并行程序设计,究竟应该被称为“并行([/font]parallel[font=宋体])”还是“并发([/font]concurrency[font=宋体])”,并没有统一的认识。通常将“并行”定义为在多个计算单元上同时执行多个任务,而将“并发”定义为在单个计算单元上以分时的方式“同时”执行多个任务,由于多核[/font]CPU[font=宋体]有多个计算单元,因此似乎成为“并行”更加合适。但又因为单个多核[/font]CPU[font=宋体]对外只表现为一个计算单元,因此似乎“并发”也很合适。对这个问题缺乏统一的认识。从软件开发上来看,无论是否执行在多个核上,编程方法本身必须发生变化,这种变化了的编程方法通常被称为“并发编程”,表明这样方式编写的程序既可以跑在多个计算单元上,也可以以分时的方式执行在一个计算单元上。[/font]