计算机领域正在发生着悄无声息的革命。英特尔,AMD及其他芯片制造商不断推出在单晶片上集成多重处理单元的新型芯片。取代过去的单一中央处理器,计算机目前正在步入多核时代。尽管这项技术对我们而言并不是新鲜事物,但这是这种类型的体系架构首次大规模运用于商用个人电脑和服务器市场。
这场变革将影响到每位计算机用户。多核技术的触角已经深入到服务器,笔记本电脑甚至游戏机控制台领域。从最终用户的角度来看,这种变革的影响是潜移默化的。然而根据过去二十年的经验要获取相应的性能所付出的价格预期还是个未知数。程序设计者们会发现要实现多核设计的性能也是一项充满挑战的艰巨任务,特别是现在还没有一劳永逸的办法和自动化技术能适应多核系统上运行的现行软件。
指路多核
计算机市场长期以来一直在处理器速度上稳步前进。处理器的速度很大程度上取决于时钟频率传递给处理器执行指令的速度有多快。时钟频率越快,处理器在指定时帧内执行的指令数目就越多。半导体的物理特性对处理器时钟频率速度的提升会有限制。这种趋势可以从图示一中清楚的显示,从中可以看到英特尔和AMD处理器随着时间推移平均时钟频率和热量消耗的情况。
从这张能量消耗曲线图上看,能量消耗的持续攀升要求更多的冷却和电力服务来维持处理器的运行。解决方案就是要增加处理器内核的比例来取代单纯提升时钟频率。这张图中时钟频率的下降是指AMD公司和英特尔公司的首款双核处理器的面世。这些处理器的设计考虑到热量的问题,相对单核处理器设计的时钟频率要低。双核芯片从过往经验来看,能达到单核芯片两倍的性能,从而能帮助处理器的性能不断进步。
多核发展之路
目前英特尔公司和AMD公司都推出了自己的多核处理器。双核和四核处理器目前已经投入市场。从公司的市场导向来看,他们还计划在2009年到2010年陆续推出八核处理器。大致时间表如下:
2005年 双核处理器
2007年 四核处理器
2009年+ 八核处理器
服务器和工作站传统上都是使用双路处理器。这就意味着到2010年底每个母板上核心的总数量能轻易的达到16个。另外,AMD和英特尔处理器都提供四路甚至八路插槽设计。从八路核心由此类推就意味着在不久的将来六十个四核服务器也并非不能实现的预期。
多核面临的挑战
多核处理器的革命给整个计算机领域带来了前所未有的挑战和机遇。一方面,多核意味着在同样的空间内实现更多的计算功效。另一方面,处理器体系架构的根本性变化要想充分利用这些处理器,比起之前的设计就更具挑战性。
面临的挑战之一就是软件,概述如下:
现有的软件如果不做改变,就无法利用目前不断进步的处理器所提供的多核性能。
为了充分利用多核,程序需要同时做很多事情。这种行为通常被称为并行计算。并行程序如果编译正确,执行指令的速度将比传统的串行程序要快很多,因为它能将工作负载按照不同需求分配给处理器的不同核心。而传统的串行程序只能利用一个核心。确实这种程序编译方式也只能识别一个核心!
多核带来的影响
从最终用户的角度来看多核对工作负载的影响更为直接。举例来说,你的工作负载要同时执行不同的任务,此时多核系统就能马上发挥它的优势所在。比如,你在网络上观看视频的同时,你的计算机正在准备打印一份大型文档作业。多核系统就能协助你同时完成这些作业。如果他们不是采用并行设计的话,独立的应用程序将不可能超越单核的速度。
应用程序的设计者们为了满足多核的需求需要花费时间对代码进行升级和测试。在并行程序设计上没有简单或者自动化的捷径可循,因此多核菜单(MCCB)的设计就需要付出更多的努力。除了研发多核应用软件需要花费额外的心血外,还要适应不断涌现的全新概念。
内存之争
从定义上说,所有的多核系统都必须共享内存。设计内存子系统能让核心之间的争夺最小化,但是仍然会出现内存空间为两个或者更多内核所用的时候。这种情况在很多时候就会导致性能问题或者性能衰减。
资源之争
与传统的单核处理器不同,多核系统的每个核心都必须共享本地资源。除了内存之外,这些资源还包括硬盘,网络连接,PCI总线和个人电脑,工作站或者服务器的其他组件。
Program Locality
在多核系统中,应用程序在那个核心上运行取决于操作系统。操作系统会尽可能的让所有的核心的工作负载均等。通过在核心间对程序进行迁移来实现分配。如果万一程序迁移所在的核心无法使用同样的高速缓存或者本地内存资源,那么程序就会丧失高速缓存数据的优势所在,性能也会因此衰减。
新的错误类型
多核也会引发程序设计中新的错误类型。这种情况的出现是因为在核心间新的时间动态分配出现了问题。当核心都在互相等待和冻结或者他们不能保持同步时,这种情况就会发生从而报错。程序设计者们必须在编译应用程序时对这一点有清醒的认识。
程序模式
最后一个问题就是程序模式。在多核系统中,核心是通过内存共享数据和通讯。程序设计者们实现的途径是取决于他们惯常编写代码的程序模式。对于所有的多核程序设计来说,没有单一的标准方式(程序语言或者API)是可以通行无阻的。处于多核菜单的设计目的,我们将程序设计方法分成两类:
主流方法:这种设计方法就是公开/标准API(应用编程接口),从过往经验看API已经在并行程序设计上取得了成功,具有丰富的编程经验基础来向程序设计者提供支持。采用API的编程方法在灵活性和将来的升级支持方面都是风险较低的选择。但对于特别问题处理方面却并非最佳的编程方式。
新生力量:这些编程方法是新生力量,在将来也颇具潜力。但是并非所有的方法都具备这样的实力,成为大型项目程序的选择(比如说有些尚处于试验阶段)。虽然他们在实现并行程序方面更为出色,但作为一项新兴的技术要进行推广还有一定风险。
当然,我们试图向软件研发人员提供指南的意图颇有些班门弄斧。毕竟只有程序设计者们最清楚项目的规模和需求,这些分析是要协助设计者们把握选择的方向。我们的愿望是编程方法的新生力量能逐渐成为设计的主流,随着多核系统的逐步普及这些编程方法也能得到更广泛的使用。
这些新兴的编程模式数量太多而无法一一罗列,甄选出的主要方法由三种组成:Threads(线程技术),OpenMP和MPI并行算法。Threads(线程技术)使用的是均衡共用存储器或者共享内存,在传统多核系统中已经有多年的使用历史。
另外一种正在发展之中并能相对容易的利用线程的方法就是OpenMP。OpenMP使用一组指令设计来允许程序设计者更为简便的实现对称多处理机的并行要求。MPI(消息传递接口)是实现高性能计算代码并行设计的标准方式。MPI的并行设计能在独立的计算机上对进程间的信息进行传递,对于对称多处理计算机也同样适用。
未来之路
多核程序设计在计算机世界中是个广泛而动态的领域。MCCB对于多数程序设计者而言都是一个好的开端,还将继续提供多核革命的资源,案例,基准和背景资料。