并行化对编程语言的要求

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

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

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

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

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

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

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

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

高层次抽象的另外一个例子就是活动对象。活动对象在概念上运行在自己的线程上,因此创建1000个此类对象就相当于从概念上创造1000个潜在的执行线程。活动对象的行为方式与监视器非常像,但它不需要传统的锁定。相反,活动对象以外的方法调用都是异步信息,由对象对其进行汇集、排队和传送。
...全文
364 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kelkch 2007-12-12
  • 打赏
  • 举报
回复
现在的编程语言不太注重高低级之分了,而是更讲究是否适合快速应用开发,也就是RAP(Rapid Application Development). C#是RAP类, C/C++就算不上了. 甚至程序员的性质都可由此作出一个分岭.
lixianyu 2007-12-11
  • 打赏
  • 举报
回复
看过《黑客帝国》都知道,1000个线程不算什么。呵呵。
oldmanzhao 2007-12-10
  • 打赏
  • 举报
回复
GPU的流水线本身能够比较容易的展开并行任务的处理,是因为相对CPU而言,GPU要处理的任务类型相对简单,不需要面对那么复杂的多任务环境,那种多任务基本上不存在什么“调度”的问题,所以我们讲多任务处理的时候,当然一般是指构建于CPU系统上的任务调度。
OpenHero 2007-12-10
  • 打赏
  • 举报
回复
恩,看TBB得源代码,部分实现和java的多线程有异曲同工之妙,呵呵
OpenHero 2007-12-09
  • 打赏
  • 举报
回复
oldmanzhao,我想你可以了解一下GPU编程,在哪里,线程,或许就只是一个符号而已了:)

其实我们对线程的理解,都是架构在传统意义的OS之上,都是由OS来调度线程的执行,在加上平时多接触的是,串行式的编程;多线程接触得比较少,所以在面对并行化的时候,就会遇到一些固定思维上的转变困难。从编程语言上来说,自己实现一套并行算法,如果但从语言本上上来说,只是用最基本的语法来实现一些并行算法,从这个角度上,现在还或许没有真正意义上的并行的语言,我们谈到语言的时候,或许更多的是语言所伴生的语言库,架构中前人之上的东西,在这之上,方便了多线程的编程。OpenMP的各种库,TBB这样的Intel提供的开源库,都方便了我们实现并行化的算法。

zyx0507 2007-12-09
  • 打赏
  • 举报
回复
现在软件发展的一个方向就是最大限度地减轻编程人员的负担,这是很现实的一个问题.
如何来减轻编程人员的任务,那就是提供更好的帮助,更多的接口和方法等.软件并行化的好处不言面喻.所以这就需要软件设计人员和软件开发人员共同的努力了.
oldmanzhao 2007-12-03
  • 打赏
  • 举报
回复
1000个类就1000个线程,就算从概念上说,这也是比较恐怖的。
zhangyixian525 2007-12-02
  • 打赏
  • 举报
回复
这个问题应该值得大家好好的讨论讨论,发表一下自己的观点.本人才疏学浅.对编程做过不少开发.
但是理论知识比较薄弱.有丰富经验的大拿们可以华山论剑一把啊?
Simore 2007-11-28
  • 打赏
  • 举报
回复
学习!

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧