【问题标题】:Why a recursive algorithm cannot be parallelized efficiently ?为什么递归算法不能有效地并行化?
【发布时间】:2018-04-21 09:42:26
【问题描述】:

将包含递归的顺序代码转换为用 openmp、CUDA 或 MPI 编写的等效并行代码非常困难。 为什么会这样?

【问题讨论】:

  • 您的问题包含尚未计算的悬空依赖关系:哪些代码,究竟是什么意思,以及您引用或引用的确切对象/来源?

标签: recursion parallel-processing mpi openmp


【解决方案1】:

如果将一段代码编写为递归算法,则在每一级递归中执行的计算很可能取决于下一级的结果。这意味着很难从不同的递归步骤并行进行计算。

另一种思考方式是想象将递归扁平化为迭代(参见例如Can every recursion be converted into iteration?)。递归算法可能会生成一个扁平化版本,其中每次迭代都依赖于其他迭代的结果,因此很难并行进行迭代。

【讨论】:

  • 这只是部分准确。想象一下,如果你愿意,一棵树在每个非终端都有 4 个分支,并且一直有相同的深度。考虑到您有 4 个进程,并行搜索树中的元素的一个简单选择是为每个处理器提供一个来自根的分支。有一些递归算法可以很容易地并行化,而无需转换为迭代。
  • 我会更进一步说,如果不是完全错误的话,它充其量只是高度误导。 1) 完全有可能并行化递归代码而不使用任务或类似的范例将其展平。 2)在扁平递归算法中,迭代不一定依赖于先前的迭代。此答案适用的唯一情况是始终存在一个递归调用。
  • @HighPerformanceMark 这感觉更像是在一个步骤中并行化,而不是并行执行不同的递归步骤,这是我认为的目标。但我确实同意你的观点——包含递归的算法可以采用所有形式,并且很可能具有易于并行执行的部分。我将尝试改写,以便我的推理更像是一个例子。
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多