Recursion 为什么递归算法不能有效地并行化?

Recursion 为什么递归算法不能有效地并行化?,recursion,parallel-processing,mpi,openmp,Recursion,Parallel Processing,Mpi,Openmp,将包含递归的序列代码转换为用openmp、CUDA或MPI编写的等效并行代码非常困难。 为什么会这样?如果一段代码是作为递归算法编写的,那么在每一级递归中执行的计算很可能取决于下一级递归的结果。这意味着很难从不同的递归步骤并行进行计算 考虑这一点的另一种方式是想象将递归平坦化为迭代(参见示例)。递归算法可能会生成一个平坦版本,其中每个迭代都依赖于其他迭代的结果,这使得并行进行迭代变得困难。您的问题包含尚未计算的悬而未决的依赖关系:哪种代码,什么确切地说意味着困难,你引用或引用的确切信息来自谁/哪

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

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


考虑这一点的另一种方式是想象将递归平坦化为迭代(参见示例)。递归算法可能会生成一个平坦版本,其中每个迭代都依赖于其他迭代的结果,这使得并行进行迭代变得困难。

您的问题包含尚未计算的悬而未决的依赖关系:哪种代码,什么确切地说意味着困难,你引用或引用的确切信息来自谁/哪里?这只是部分准确。想象一下,如果你愿意的话,一棵树在每个非终点都有4个分支,并且一路都有相同的深度。如果您有4个进程,那么并行搜索树中的元素的一个简单选项是从根给每个处理器一个分支。有一些递归算法在不转换为迭代的情况下很容易并行化。我想进一步说,如果不是完全错误的话,它充其量是高度误导的。1) 完全可以并行化递归代码,而无需使用任务或类似范例将其扁平化。2) 在平坦递归算法中,迭代不一定依赖于上一次迭代。这个答案适用的唯一情况是始终存在一个递归调用。@HighPerformanceMark感觉更像是在一个步骤中进行并行处理,而不是并行执行不同的递归步骤,这是我假设的目标。但我同意你的观点——包含递归的算法可以采用所有形式,并且可能有易于并行实现的部分。我将尝试重新措辞,使我的推理更像是一个例子。