divide and conquer & fork and join的区别

difference of divide and conquer & fork and join

在C++中,divide and conquer & fork and join有什么区别? fork 和 join 是否是分而治之的特定情况,因为 fork 和 join 仅适用于并行性?谢谢!

"Divide and conquer" 是一种通用的编程方法,用于将较大的问题分解为更易解决的子问题,分别求解(有时递归),最后通过组合子问题的答案产生大问题的答案-问题。这是一个不特定于 C++ 的想法。

"Fork" 和 "Join" 命名在多种语言中可用的特定并行原语。 "Fork" 导致启动另一个执行线程; "join" 导致当前线程等待另一个线程完成并同步。我相信 C++14 标准内置了这样的原语。许多其他语言没有这个内置的,但它通常可以通过库(包括早期版本的 C++)获得。

人们可能会使用 "Fork" 和 "Join" 来实现 "Divide and conquer" 增强的并行性。像这样使用,"fork" 将线程发送到单独的子问题,并且 "join" 是必要的,作为表示子问题完成的步骤。但是 "join" 并没有专门计算 "big" 问题的综合答案。您可能需要更多的代码,而不仅仅是 fork 和 join。

基本上,Fork-Join 将手头的任务分解为小任务,直到小任务足够简单,无需进一步分解即可解决。这就像一个分而治之的算法。此框架中需要注意的一个重要概念是,理想情况下没有工作线程处于空闲状态。他们实施了一种工作窃取算法,让空闲的工作人员从忙碌的工作人员那里窃取工作。

  Result solve(Problem problem) 
  {
        if (problem is small)
            directly solve problem
        else 
             {
            split problem into independent parts
            fork new subtasks to solve each part
            join all subtasks
            compose result from subresults
          }
  }

C++14 有一些与 fork & join 相关的问题,您可以从这个站点阅读更多内容 (http://www.meetingcpp.com/index.php/br/items/a-look-at-c14-papers-part-2.html)