转向并行编程

4

我们都在为单处理器编写代码。我想知道我们何时能够编写多处理器的代码?

我们需要什么(软件工具、逻辑、算法)来实现这种转换?

编辑:在我看来,正如我们同时执行许多任务一样,我们需要将那些真实的解决方案(算法)转换成计算机语言。就像面向对象编程对过程式编程所做的那样。面向对象编程是比过程式编程更接近真实生活的编码风格,所以我希望能有那种类型的解决方案。

7个回答

5
我认为最重要的要求是一种具有本地支持并行性的结构或可以自动生成并行代码的良好语言。有很多符合这个描述的语言,但它们中没有一个足够流行以被认为是主流使用。这反过来又是由几个原因造成的:
  1. 从它们的本质上讲,这些语言与今天的命令式语言非常不同,因此更难学习(或者至少看起来是这样)。
  2. 它们经常缺乏好的工具和库,使它们无法用于任何“真正”的项目。
当然,如果它更受欢迎,更多的人将愿意学习它,并且会有更多的支持,所以这是一种相当难以摆脱的循环。我想我们能做的就是希望。 :)
一个设计时考虑到大量并行化的语言的例子是Erlang-它实际上被用于商业项目中。

4
我们需要的是高度并发算法的自然抽象。演员(请想一下:Erlang)在这方面已经走了很远,但它们并不是一种一刀切的解决方案。一些更具体的抽象,比如fork/join或map/reduce,甚至可以更容易地应用于常见问题。
所有这些并发抽象的诀窍在于它们需要函数式编程。并发与共享可变状态不相容。正如他们所说,“锁定是有害的”。由于大多数开发人员来自严格的命令式背景,转向共享无内容传递方法通常极具挑战性。
顺便说一下,在并发抽象方面,Clojure在这方面有一些非常有趣的特性。它不仅拥有类似演员的功能,而且还定义了一个事务内存模型(请考虑数据库),以及全局原子引用机制。这两个特性允许并发操作共享“可变”状态,而无需担心锁定或竞争条件。
最终,这归结于教育。大部分对并发抽象所需的理论工作已经完成,我们只需要接受它。不幸的是,正如Erlang和Haskell证明的那样,有时候最好的想法仍然局限于极小的人群。希望像Scala和Clojure这样的努力能够成功地将更高级的抽象悄悄地引入现有的,得到良好支持的平台(JVM)。

3

遗憾的是,在大规模并发编程方面,除非编译器有所突破,否则我们将会抛弃我们对算法的了解(我认为甚至Don Knuth也说过这个)。阅读Erlang,可以一窥这种可能的未来。


3

有几种工具/语言很受欢迎或正在变得流行。如果您使用FORTRAN、C或C++,可以使用OpenMP(实现不太困难)或消息传递接口(MPI)库(强大且具有最大加速潜力,但也复杂且困难)。OpenMP使用预处理器指令来标记可以并行化的区域,特别是循环。MPI使用消息在进程之间传递数据,最大的困难是在不触发瓶颈和保持进程等待的情况下保持所有内容同步。然而,我会说MPI肯定已经过时了。在科学/高性能计算社区中已经清楚地表明,加速比很少值得额外的开发时间。

关于即将推出的编程语言,可以看看Fortress。它仍在设计中,但目标是创建一种比FORTRAN更易于进行科学计算的语言。程序将采用非常高级的数学语法进行指定。此外,并行性将是隐式的;程序员必须努力以串行方式完成任务。另外,它由Sun发起并基于java,因此具有可移植性。

0

对于Java,现在你可以看看Parallel Java Library或DPJ(确定性并行Java!) 它将为您提供从代码中提取并行性的巨大帮助!!


0

没有简单的答案,而且在很多方面,即使是复杂的答案目前也还不足或不完整。如果您更具体地说明您想要的回复:指向开发库和工具的指针、教学材料、指向当前研究项目和该领域的问题,或其他什么?那么您将得到更好的答案。


在我看来,正如我们同时执行许多任务一样,同样需要将那些现实生活中的解决方案(算法)转换为计算机语言。就像面向对象编程对过程式编程所做的一样。面向对象编程是比过程式编程更贴近现实生活的编码风格。因此,我希望能够得到那种类型的解决方案。 - K. Santosh

0
最重要的要求是能够将您的问题分解成可以独立解决的较小问题。一旦您想出了如何做到这一点,其他所有事情都更容易考虑,实现方面的进一步问题(例如,“我的计算的某些部分依赖于其他部分 - 我该如何等待它们完成?”)变成了具体的、可以研究或在这里询问的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接