1975年,未来的名人堂成员罗杰·斯陶巴赫在对阵明尼苏达维京人队的季后赛中只有橄榄球。在比赛还剩24秒时,这位达拉斯牛仔队的四分卫在中场落后四分,他闭上眼睛,用尽全力把球扔出去,然后说了一声万福玛利亚。(对于足球迷来说,这就像大卫·贝克汉姆在伤停补时阶段从中场射门一样。)
他的祈祷应验了。Staubach的接球手在球到达时与维京海盗队的防守队员相撞,但仍然设法将足球钉在他的腿上,得分达阵,使牛仔队进入超级碗。(想象一下贝克汉姆的长传打过了守门员。)自从那场比赛以来,一次几乎没有成功机会的绝望传球就被贴上了“万福玛利亚”的标签。
30年后,半导体行业从让微处理器运行得更快转向把更多的微处理器放在芯片上,这相当于孤注一掷——在这样做的时候,对这种设备通常会如何编程没有任何清晰的概念。我们希望有人能够找到解决办法,但目前,球还在空中。
为什么要冒这样的险?简而言之,因为没有太多的选择。
几十年来,微处理器设计者们一直在利用可以压缩到每个芯片上的晶体管数量激增来提高计算能力。他们通过创造可以同时执行多个操作的微处理器来实现这一点——例如,当当前指令正在执行时,从内存中获取下一条指令。芯片制造商不断提高微处理器的时钟频率,这是晶体管尺寸不断减小所允许的。
但在2003年左右,芯片制造商发现他们无法再像过去那样大幅降低工作电压,因为他们努力让晶体管更小、更快。这反过来又导致每平方毫米硅必须消散的废热量增加。最终,设计师们遇到了他们所谓的“功率墙”,即微处理器芯片合理耗电量的上限。毕竟,一台烧到你大腿的笔记本电脑很难卖出去。
设计师们现在承认,尽管每个芯片上的晶体管仍将变得越来越小,数量越来越多,但它们的运行速度不会比现在更快。(事实上,现在的时钟峰值速度比五年前要低。)如果你试图将所有这些晶体管集成到一个巨大的微处理器中,你很可能会得到一个计算速度并不比它正在取代的芯片快的设备,这就解释了为什么要将它们组装到多个微处理器内核中。尽管每个核心可能都有一定的计算能力,但您可以使用其中的许多核心。
这样的新型芯片被称为多核微处理器——当涉及大量核时,有时称为多核微处理器——以区别于传统的单核设计。借用加州圣克拉拉Tensilica公司总裁兼首席技术官克里斯·罗文(Chris Rowen)的一句话,从某种意义上说,核心已经成为新的晶体管。也就是说,从现在开始,芯片设计师将专注于如何将许多核心组合在一起,就像上一代微处理器工程师在单个晶体管的水平上考虑他们正在创建的电路一样。
诀窍在于为程序员发明一种方法,使其能够在不延长软件开发时间或降低软件质量的情况下,利用每块芯片上不断增加的处理器数量来编写应用程序。现在就祈祷吧,因为这并不容易。
当总统2004年,英特尔首席执行官保罗·欧德宁(Paul S. Otellini)宣布,他的公司将“把我们未来所有的产品设计都奉献给多核环境”,为什么他把这称为“行业的关键拐点”?对于熟悉许多已经倒闭的公司的人来说,答案很清楚,这些公司把自己的未来押在了从单核计算机到多处理器并行工作系统的转变上。Ardent、Convex、Encore、float Point Systems、Inmos、Kendall Square Research、masaspar、nCUBE、sequence、Tandem和Thinking Machines只是一长串有望成为并行公司的名单中最突出的名字。欧德宁宣布,尽管有这一令人清醒的记录,但只有程序员能够为英特尔和其他半导体公司已经开始推出的多核微处理器编写并行程序,未来的软件应用程序才能运行得更快。
但是为什么并行处理如此具有挑战性呢?这里可以打个比方。编程在很多方面就像写新闻报道。10个记者完成一篇报道的速度可能是一个记者的10倍。但他们需要把一项任务分成10个大小相等的部分;否则,他们无法实现10倍的加速。
然而,如果故事的一部分在剩下的部分完成之前无法完成,就会出现问题。这10名记者还需要确保每一段文字都与前一段保持一致,下一段也要有逻辑地从前一段开始,而不是重复任何材料。此外,他们还必须安排好努力的时间,以便同时完成任务。毕竟,当你还在等待一篇文章完成的时候,你不可能发表一篇文章。同样的问题——负载平衡、顺序依赖和同步——也给并行程序员带来了挑战。
自20世纪60年代以来,研究人员一直试图解决这些问题。人们尝试了许多想法,但同样多的想法都失败了。一个早期的愿景是,正确的计算机语言将使并行编程变得简单。开发此类语言的尝试已经有数百次(如果不是数千次的话),包括诸如APL、Id、Linda、Occam和SISAL等早已消失的例子。有些人使并行编程更容易,但没有一个人能使它像传统的顺序编程那样快速、高效和灵活。也没有一种语言像主要为顺序编程而发明的语言那样流行。
另一个希望是,只要硬件设计得当,并行编程就会变得很容易。许多私人投资者被这种想法所吸引。许多人试图建立计算机体系结构的黄金国,但还没有人成功。
第三个想法也可以追溯到20世纪60年代,即编写能够自动并行现有顺序程序的软件。历史告诉我们,这里的成功与核数成反比。根据程序的不同,尝试为两个、四个甚至八个核自动并行可能会有一些好处。但是大多数专家仍然怀疑任意顺序代码的自动并行化是否对32、64或128核有利,尽管最近在这一领域发表了一些进展。
总的来说,情况看起来相当暗淡。尽管如此,在一些社区已经取得了进展。一般来说,当您有能力组建一个由博士级程序员组成的优秀团队来解决包含许多不同任务的问题时,并行性是可以发挥作用的,而这些任务之间的依赖性很小。银行用于管理ATM交易的数据库系统和航空公司用于跟踪预订的数据库系统就是一个例子。另一个例子是网络搜索。并行化处理大量用户做几乎相同事情的程序要比处理单个用户做非常复杂的事情容易得多。这是因为您可以很容易地利用手头问题固有的任务级并行性。
另一个成功的故事是计算机图形学。动画电影或带有大量计算机生成特效的电影在单个场景可以并行计算的情况下表现出任务级并行性。聪明的程序员甚至在计算每张图像时发现了并行性。事实上,用于加速PC游戏的高端图形处理单元(gpu)可以包含数百个处理器,每个处理器只处理渲染图像的一小部分工作。计算机科学家将术语“数据级并行”应用于此类应用程序。它们很难编程,但一般来说,它们比不提供这种固有并行性的应用程序更容易。
科学计算提供了第三个成功案例——天气预报和车祸模拟是两个著名的例子。这些长时间运行的程序具有大量的数据级并行性。创建这些程序的精英团队通常由计算机科学家博士和与应用程序相关的科学博士组成。桌面应用程序很少有这么强大的智力支持。
考虑到这种严峻的形势,您可能不会期望这种最新的并行计算尝试会获得成功。但我们有理由保持乐观。首先,整个计算机行业现在都在研究这个问题。此外,向并行的转变开始时很小,而且发展缓慢。程序员现在就可以在双核和四核处理器上磨合,而不是一下子跳到128核。
然而,最大的因素之一是动机的程度。在过去,程序员可以等待晶体管变得更小更快,让微处理器变得更强大。因此,不需要任何新的编程工作,程序就会运行得更快,这对那些试图尝试编写并行代码的人来说是一个很大的阻碍。程序性能的La-Z-Boy时代现在正式结束了,所以那些关心性能的程序员必须从躺椅上站起来,开始让他们的程序并行。
成功的另一个潜在原因是多核处理和软件即服务(通常称为云计算)之间的协同作用。谷歌Search、Hotmail和Salesforce是此类服务的一些实例,其中您需要的应用程序运行在远程数据中心,而不是在您自己的计算机上。这些服务很受欢迎,因为它们减少了用户和提供商的麻烦。用户只需要一个浏览器,不需要在软件安装、升级和补丁上浪费时间。软件供应商也很高兴,因为他们的应用程序只在数据中心内运行,他们控制环境。这使得他们的开发人员能够比程序员编写传统的“收缩包装”应用程序更快地改进他们的软件,传统的应用程序必须在许多不同的计算机上运行,并安装许多硬件和软件的组合。
专业程序员可以利用云计算中固有的任务级并行性。为了服务数百万用户,这些程序员将工作分配到数千台计算机上运行。因为他们的软件已经使用了很多处理器,所以人们很容易就可以使用多核芯片。事实上,这些云计算提供商将多核技术视为一种受欢迎的降低成本的方式,而不是颠覆性的技术。因此,多核处理器的大量涌现将推动当今快速增长的云计算热情。
尽管有这些原因虽然希望渺茫,但微处理器行业仍然很难完全完成冒险的万福玛利亚之路,找到一种全面的方法,将每个软件都转换成可以在多个并行处理器上运行。我和其他主要并行计算研究中心(包括佐治亚理工学院、伊利诺伊大学、莱斯大学、斯坦福大学和加州大学伯克利分校)的研究人员当然不期望这种情况发生。因此,我们不是致力于一般的编程语言或计算机设计,而是尝试创建一些可以利用多核微处理器的重要应用程序。尽管这些团队都不太可能开发出终极杀手级应用,但这并不是他们的意图。相反,我们希望我们发明的硬件和软件将包含一些使并行编程简单明了所需的关键创新。如果我们成功了,这项工作应该有助于引入最终赢得“杀手”称号的任何应用程序。
例如,我和我在伯克利并行计算实验室(Par实验室)的同事决定只研究几个目标应用程序。一个是语音识别,或者我应该说语音理解。我们希望极大地改进语音识别软件,这样计算机就可以在拥挤、嘈杂和混响的环境中识别人们说的话。这将超越目前粗糙的语音识别软件,实现实时会议记录等功能。这样的软件现在已经存在,但这些程序会产生令人沮丧的大量错误。
我们在这方面面临的一个问题是,拥有大量核心的微处理器还没有被制造出来。所以我们没有东西来运行我们的实验软件。一个多核微处理器原型的设计需要数年时间,制造成本则高达数百万美元。原则上,我们可以在软件中模拟这种芯片。但是,以评估128核设计所需的详细级别运行的软件可能需要几天来模拟几秒钟,这意味着硬件和软件改进之间的迭代将极其缓慢。
插图:Harry Campbell
然而,我们可以通过使用现场可编程门阵列(fpga)来模拟未来的计算机来绕过这个障碍。fpga是集成电路,包含大量的电路组件,可以使用一种特殊的语言来描述所需的硬件配置,实时地连接在一起。而且它们可以根据需要多次重新布线。因此它们提供了两全其美的功能,既有软件的灵活性,又能以软件模拟器250倍的速度运行。这一前景激发了多处理器研究加速器(RAMP)项目的灵感,该项目由近十几所大学和公司合作,旨在创建和共享一个公共基础设施,以加速多核设计的研究。
需要多少RAMP配置和专门的编程环境仍然是每个人的猜测。2004年,劳伦斯伯克利国家实验室的Phillip Colella宣称,七种数值方法将主导未来十年的科学计算。从这个说法开始,他、我和其他伯克利计算机科学家花了两年时间评估这七项技术在其他领域的工作效果。我们最终将列表扩展到12种通用方法。可以把这些看作是基本的计算模式,它们就像在波斯地毯上发现的各种图案一样不同——树、螺旋、涡纹花纹等等。
12个计算主题中的一些是令人尴尬的并行。以所谓的蒙特卡罗方法为例,这种方法对一些物理过程进行多次独立的随机试验,以确定一个更一般的结果。使用这种方法可以做很多事情。例如,你可以确定圆周率的值。只要计算一下,当你把飞镖扔到一块方形板上会发生什么。如果飞镖击中正方形上的任意点,有多少飞镖落在你能在棋盘上画的最大的圆内?计算出这个数字,如果有足够的省道,你就会知道圆的面积。除以半径的平方,就得到了。
其他主题可能很难并行执行,例如通过一系列定义良好的状态进行排序的常见问题,其中从一个状态转换到另一个状态的规则取决于各种外部输入的值。顺序计算机根据当前的状态和当时的输入,计算出下一个应该假设的状态。拥有多个可用的内核并不能大大加快这个过程,所以更快地运行状态序列的唯一机会是提前弄清楚可能出现的状态转换。但这需要计算机猜测它可能很快会处于哪种状态,以及在此期间输入会如何变化。当你猜错了,你需要很长时间来恢复,你甚至会比没有任何猜测的时候更慢。我们希望你大多数时候都猜对了,所以平均来说你会领先。至少可以这么说,弄清楚如何对这种状态转换的推测进行编程是很棘手的。
1995年我曾公开预测过2020年微处理器会是什么样子。我天真地期望,在芯片制造商开始推出我当时称之为“微多处理器”的东西之前,信息技术社区会发现如何进行并行编程。从2010年的角度来看,我现在认为2020年有三种可能性。
第一种是我们把事情搞砸了。也就是说,每个芯片的实际内核数达到了上限,微处理器的性能停止增长。这样的结果将对信息技术产业产生广泛的影响。微处理器很可能每年都会变得更便宜,包含微处理器的产品也会如此。但它们并不具备更强的计算能力。考虑上网本作为这条降低成本之路的第一步。这样的演变只会加速向云计算的转变,因为做实际工作的服务器将能够利用多核微处理器的并行性,即使台式机和手持电脑不能。
另一种可能性是,我们中的少数人将能够抓住今天危险的万福玛利亚。也许只有多媒体应用程序(如视频游戏)可以利用数据级并行性,并利用不断增加的内核数量。在这种情况下,2020年的微处理器可能更像英伟达(Nvidia)、高级微设备(Advanced Micro Devices)和英特尔(Intel)的gpu,而不是今天的传统微处理器。也就是说,GPU将从一个次要事件提升到主要事件。目前还不清楚这些应用程序本身是否能够维持整个信息技术行业的增长。
当然,最乐观的结果是,有人想出了如何使可靠的并行软件随着内核数量的增加而有效地工作。这将为未来30年微处理器硬件的构建提供急需的基础。即使每个芯片晶体管数量每一年或两年翻一番的常规停止了——摩尔定律的可怕终结——创新的封装可能会让多个芯片创造出经济的系统,维持消费者长期以来所享受的性能提升。
尽管我支持这一结果——我和许多同事也在努力实现这一结果——但我不得不承认,第三种情况可能不是最可能的。正如全球气候变化将使一些国家比其他国家更不利一样,微处理器行业所受到的影响可能是不均衡的。一些公司将屈服于微处理器无法像过去那样发展。其他人将从计算领域的新变化中受益。
不管球如何弹跳,至少对球迷来说,观看比赛都是很有趣的。下一个十年将是有趣的。