4

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

我们需要什么(软件工具、逻辑、算法)来进行这种切换?

编辑:在我看来,当我们并行执行许多任务时,我们需要将这些现实生活中的解决方案(算法)转换为计算机语言。就像 OOP 编码对过程编码所做的那样。OOP 是一种比程序更真实的编码风格。所以我希望有这种解决方案。

4

7 回答 7

5

我认为最重要的要求是一种良好的语言,它具有支持并行性的原生结构或可以自动生成并行代码的语言。有相当多的语言符合这种描述,但没有一种语言流行到足以真正被考虑用于主流用途。这反过来又是由几件事引起的:

  1. 就其本质而言,这些语言与今天的命令式语言非常不同,因此更难学习(或者至少看起来是这样)。
  2. 它们通常缺乏好的工具和库,使得它们无法用于任何“真正的”项目。

当然,如果它更受欢迎,就会有更多的人愿意学习它,会有更多的支持,所以这是一种很难打破的循环。我想我们能做的只有希望。:)

Erlang 是设计时考虑到大量并行化的语言的一个例子——它实际上用于商业项目。

于 2008-09-18T05:53:01.903 回答
4

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

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

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

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

于 2008-09-18T06:15:17.573 回答
3

有几种流行或正在流行的工具/语言。如果您使用 FORTRAN、C 或 C++,您可以使用OpenMP(不太难实现)或消息传递接口(MPI) 库(强大且最大的加速潜力,但也复杂且困难)。OpenMP 使用预处理器指令来标记可以并行化的区域,尤其是循环。MPI 使用消息在进程之间来回传递数据,最大的困难是保持一切同步而不会遇到瓶颈并让进程等待。但是,我会说 MPI 肯定会被淘汰。科学/高性能计算社区很清楚,加速很少值得额外的开发时间。

至于新兴语言,请查看Fortress。它仍在设计中,但目标是创建一种比 FORTRAN 更容易用于科学计算的语言。程序将以非常高级的数学语法指定。此外,并行性将是隐含的;程序员将不得不工作以串行方式做事。此外,它受到 Sun 的拥护,并且基于 java,因此它是可移植的。

于 2008-10-09T00:40:35.590 回答
3

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

于 2008-09-18T05:59:54.210 回答
0

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

于 2013-08-17T08:57:00.553 回答
0

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

于 2008-09-18T05:41:55.283 回答
0

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

于 2008-09-24T16:04:04.590 回答