Multithreading 切换到并行编码

Multithreading 切换到并行编码,multithreading,math,parallel-processing,high-speed-computing,Multithreading,Math,Parallel Processing,High Speed Computing,我们都在为单处理器编写代码。 我想知道我们什么时候都能在多处理器上编写代码 这种转换需要什么(软件工具、逻辑、算法) 编辑:在我看来,当我们并行完成许多任务时,我们需要以同样的方式将那些现实生活中的解决方案(算法)转换为计算机语言。就像OOPs编码对过程编码所做的那样。OOPs是一种更真实的编码方式,而不是过程式的。所以我希望有这样的解决办法 没有简单的答案,在许多方面,即使是复杂的答案目前也不充分或不完整。如果你对你想要的回复更具体一些,你会得到更好的答案:指向开发库和工具的指针,教学材料,指

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

这种转换需要什么(软件工具、逻辑、算法)


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

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

我认为最重要的要求是一种好的语言,它具有支持并行性的本机结构,或者能够自动生成并行代码。有相当多的语言符合这种描述,但没有一种流行到足以被认为是主流使用的程度。这反过来又是由以下几方面造成的:

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


    Erlang是一种考虑了大量并行化的语言,它实际上用于商业项目。

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

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

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

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


    归根结底,归根结底是教育。并发抽象所需的许多理论工作已经完成,我们只需要接受它。不幸的是,正如Erlang和Haskell所证明的那样,有时最好的想法仍然被边缘化的人群所排斥。希望像Scala和Clojure这样的努力能够成功地将更高级的抽象引入主流,将它们偷偷地移植到现有的、支持良好的平台(JVM)上。

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

    有几种工具/语言很流行或越来越流行。如果你使用FORTRAN、C或C++,你可以使用(不太难实现)或(MPI)库(强大和最大的加速潜力,但也很复杂和困难)。OpenMP使用预处理器指令来标记可并行化的区域,尤其是循环。MPI使用在进程之间来回传递数据的消息,最大的困难是在不遇到瓶颈和让进程等待的情况下保持所有内容的同步。然而,我要说的是,MPI肯定即将退出。在科学界/高性能计算界,很明显,加速很少值得额外的开发时间


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

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

    在我看来,正如我们并行地完成许多任务一样,我们需要以同样的方式将那些现实生活中的解决方案(算法)转换为计算机语言,就像OOPs编码对过程编码所做的那样。OOPs是一种更真实的编码方式,而不是过程式的。所以我希望有这样的解决办法。