服务器软件的并行化革命

互联网 | 编辑: 杨剑锋 2006-06-20 17:28:00转载 一键看全文

  实现软件并行化,需要更好的编程语言,需要更高层的语言抽象,使现有的应用能够以一种渐进的方式转变成并行化的应用。

  在编程语言中我们需要什么?需要更高层的语言抽象,包括现有命令式语言的发展性扩充,使现有的应用能够以一种渐进的方式转变成并行化应用。这种编程模型必须将并行化转变成一种易于理解和分析的形式,而且不仅是在最初的开发阶段,在维护阶段更是如此。

  明示、暗示和自动并行 明示的编程模型可以提供抽象的方法,并要求编程人员能够明确地说明并行在哪里发生。明显表达并行的主要优势在于,它允许编程人员充分利用应用领域的知识,并充分表达应用中潜在的并行性。

  然而,它要求新的、更高一层的编程抽象,并且在处理共享数据时需要更高层次的编程能力。

  暗示的编程模型将并行性隐藏在库中或API(应用程序接口)后面,因此调用方看到的仍然是顺序的形式,而由库去执行并行操作。它的主要缺点是,这种方法不可能实现某些与并行有关的性能提高。此外,这种方式也很难设计出一种在任何情况下都不显示并行性的界面。

  人们还在广泛研究另外一种方法,这就是自动并行处理。在这种方法中,编译器将负责查找并行,通常是在那些以Fortran等传统语言写成的程序中。这种方法从表面上来看非常具有吸引力,但在实践中并不能很好地工作。要想理解程序的潜在行为,精确的程序分析是必不可少的。即使是对于Fortran这种简单的语言来说,这种分析也是非常具有挑战性的。此外,顺序程序通常都使用顺序算法,其中包含的并发特性极少。

  命令式和功能式语言 常用的商业编程语言(如Pascal、C、C++、Java、C#)都属于命令式的语言,即由编程人员规定变量和数据结构中的变化

  。函数(如循环)、低级数据操作和共享式的可变对象实例都会使这些语言编写而成的程序很难分析和自动并行执行。一般人都相信,功能语言,如Scheme、ML或Haskell可以消除这种困难,因为它们天生就适合并行运行,用这些语言编写的程序可以操纵不可变的对象实例,而在实践中,功能语言并不一定能够给并行执行带来益处。功能程序中的并行通常是在过程调用层面上的,而且为了适应传统的多处理器,这些过程被分割成了粒度非常精细的程序,几乎达到了不切实际的地步。功能语言对并行处理的真正贡献在于,这些语言通常使用的都是更高层次的编程风格,而在这种风格中,Map和Map-reduce等操作会将计算应用于集合数据结构的所有组件,这些较高层次的运算都是并行执行的资源。例如,Google的高级工程师就曾经描述过Google是如何使用Map-Reduce来进行大规模分布式计算的。命令式语言可以将功能扩展添加进来,这一点非常重要,为了保留目前的各类软件中的巨大投资,用户自然希望以渐进的方式逐步添加对并行处理的支持。

更好的抽象 今天的多数语言提供的是线程和锁定层面上的明示编程方式,这些抽象都属于低层次的。较高层次的抽象允许编程人员表达那些具备固有并行特性的任务,而运行时系统就可以对其进行组合和调度,使其适合实际机器上的硬件,这样就可以使应用能够在比较新的硬件上发挥更好的性能。

  高层次抽象的另外一个例子就是活动对象。活动对象在概念上运行在自己的线程上,因此创建1000个此类对象就相当于从概念上创造1000个潜在的执行线程。活动对象的行为方式与监视器非常像,但它不需要传统的锁定。相反,活动对象以外的方法调用都是异步信息,由对象对其进行汇集、排队和传送。

提示:试试键盘 “← →” 可以实现快速翻页 

一键看全文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑