切换到并行编码

时间:2008-09-18 05:38:16

标签: multithreading math parallel-processing high-speed-computing

我们都为单处理器编写代码。 我想知道我们什么时候能够在多处理器上编写代码?

我们需要什么(软件工具,逻辑,算法)进行此切换?

编辑:在我看来,由于我们做了许多并行任务,我们需要将这些现实解决方案(算法)转换为计算机语言。正如OOP编码为程序编码所做的那样。 OOP比程序式编码风格更真实。所以我希望有这样的解决方案。

7 个答案:

答案 0 :(得分:4)

我认为最重要的要求是一种优秀的语言,它具有支持并行性的本机构造或可以自动生成并行代码的构造。有很多语言符合这种描述,但是没有一种语言足够流行,真正被认为是主流用途。而这又是由几件事引起的:

  1. 就其本质而言,这些语言与今天的命令式语言非常不同,因此难以学习(或至少看起来如此)。
  2. 他们经常缺乏优秀的工具和库,使得它们无法用于任何“真正的”项目。
  3. 当然,如果它更受欢迎,更多的人愿意学习它并且会有更多的支持,所以这是一种很难打破的循环。我想我们能做的就是希望。 :)

    考虑到大量并行化设计的语言示例是Erlang - 它实际上用于商业项目。

答案 1 :(得分:4)

我们需要的是高度并发算法的自然抽象。演员(想想:Erlang)在这个方向上走得很远,但它们并不是一个通用的解决方案。一些更具体的抽象,如fork / join或map / reduce,可以更容易地应用于常见问题。

所有这些并发抽象的技巧是它们需要功能式编程。并发与共享可变状态不能很好地融合。正如他们所说,“锁被视为有害”。由于大多数开发人员都来自严格的命令背景,因此切换到无共享延续传递方法通常极具挑战性。

顺便提一下,关于并发抽象,Clojure在这个方向上有一些非常有趣的功能。它不仅具有类型的参与者,而且还定义了事务内存模型(思考:数据库)以及全局的原子引用机制。这两个功能允许并发操作共享“可变”状态,而不必担心锁定或竞争条件。

最后,归结为教育。进入并发抽象的大部分理论工作已经完成,我们只需要接受它。不幸的是,正如Erlang和Haskell所证明的那样,有时候最好的想法仍然会被置于极端边缘化的人群中。希望像Scala和Clojure这样的工作能够成功地将更高级的抽象带入主流,将它们潜入现有的,受到良好支持的平台(JVM)。

答案 2 :(得分:3)

不幸的是,对于大规模并发编程 - 除非在编译器方面有突破性的帮助,否则我们将抛出很多我们对算法的了解(我认为Don Knuth甚至说过)。阅读Erlang,了解这可能的未来。

答案 3 :(得分:3)

有几种工具/语言很受欢迎或越来越受欢迎。如果使用FORTRAN,C或C ++,则可以使用OpenMP(不太难实现)或Message Passing Interface(MPI)库(强大且最快的加速潜力,但也很复杂和困难)。 OpenMP使用预处理程序指令来标记可以并行化的区域,尤其是循环。 MPI使用在进程之间来回传递数据的消息,最大的困难是保持所有内容同步,而不会遇到瓶颈并保持进程等待。不过,我会说MPI肯定会出局。在科学/高性能计算社区中,很明显加速很少值得额外的开发时间。

关于即将推出的语言,请查看Fortress。它仍在设计中,但目标是创建一种比FORTRAN更容易进行科学计算的语言。程序将以非常高级的数学语法指定。此外,并行性将是隐含的;程序员必须努力连续做事。此外,它受到Sun的支持并且基于java,因此它将是可移植的。

答案 4 :(得分:0)

没有简单的答案,在许多方面,即使复杂的答案目前也不充分或不完整。如果您对所需的回复更具体,那么您将获得更好的答案:指向开发库和工具的指针,教学材料,指向当前研究项目的指针以及该领域的问题,还是其他什么?

答案 5 :(得分:0)

最重要的要求是能够将问题分解为可以彼此独立解决的较小问题。一旦你弄清楚你将如何做到这一点,其他一切都更容易思考和进一步的实施问题(例如“我的计算部分取决于其他部分 - 我如何等待它们完成?” )成为具体的,你可以研究或询问的具体事情。

答案 6 :(得分:0)

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