如何在图形问题中应用并行编程?
Posted
技术标签:
【中文标题】如何在图形问题中应用并行编程?【英文标题】:how to apply parallelism-programming in graph problems? 【发布时间】:2011-09-27 05:26:40 【问题描述】:问题描述:
有n tasks
,在这些任务中,one might be dependent on the others
,这意味着如果A依赖于B,那么B必须在A完成之前完成。
1.想办法尽快完成这些任务?
2.如果take parallelism into account
,如何设计程序来完成这些任务?
问题:
显然,第一个问题的答案是,对这些任务进行拓扑排序,然后按顺序完成它们。
但是如果考虑到并行性怎么做呢?
我的回答是,先对这些任务进行拓扑排序,然后挑选那些独立的任务先完成,再挑选并完成剩下的那些独立的任务……
我说的对吗?
【问题讨论】:
在执行依赖任务之前递归地并行执行每个依赖如何?您需要进行一些记账,以确保每个任务只执行一次,否则它看起来既简单又高效。 这能回答你的问题吗? Execution of Directed Acyclic Graph of tasks in parallel @AnmolSinghJaggi 您建议的目标是针对不同的语言,所以我认为不合适。 收回我的重复标志 【参考方案1】:拓扑排序算法可能会给你各种不同的结果顺序,所以你不能只取前几个元素并假设它们是独立的。
我建议不要使用拓扑排序,而是按传入依赖边的数量对您的任务进行排序。因此,例如,如果您的图表有 A --> B, A --> C, B --> C, D-->C 您会将其排序为 A[0], D[0], B[1] , C[3] 其中 [i] 是传入边的数量。
通过拓扑排序,您还可以得到 A、B、D、C。在那种情况下,很难发现可以并行执行 A 和 D。
请注意,在完成任务后,您必须更新剩余的任务,尤其是那些依赖于已完成任务的任务。但是,如果进入任务的依赖项数量限制在相对较小的数量(比如几百个),您可以轻松地依赖 radix/bucket-sort 之类的东西,并保持排序结构在恒定时间内更新。
使用这种方法,您还可以在单个并行任务完成后轻松启动新任务。只需更新依赖项计数,然后启动所有现在具有 0 个传入依赖项的任务。
请注意,此方法假定您有足够的处理能力同时处理所有没有依赖关系的任务。如果您的资源有限并且需要处理时间方面的最佳解决方案,那么您将不得不投入更多的精力,因为问题变得 NP-hard(正如 arne 已经提到的)。
所以回答你最初的问题:是的,你基本上是对的,但是你没有解释如何有效地确定这些独立的任务(见我上面的例子)。
【讨论】:
【参考方案2】:我会尝试在以任务执行时间为边权重的定向森林结构中对它们进行排序。从最重到最轻的顺序排列树枝,从最重的开始。使用这种方法,您可以同时检查循环依赖关系。
使用并行性,您会遇到 NP-hard 的 bin 问题。尝试查找该问题的近似解。
【讨论】:
我的意思当然是装箱。如果您在第一杯咖啡之前发帖,就会发生这种情况。【参考方案3】:看看Critical Path Method,取自project management。它基本上可以满足您的需求:给定具有依赖性和持续时间的任务,它会生成需要多少时间以及何时激活每个任务。
(*)请注意,此技术假设有无限数量的资源以获得最佳解决方案。对于有限的资源,有贪心算法的启发式算法,例如:GPRW [当前+后续任务时间] 或 MSLK [最小total slack 时间]。
(*)另请注意,它需要知道[或至少估计]每项任务需要多长时间。
【讨论】:
以上是关于如何在图形问题中应用并行编程?的主要内容,如果未能解决你的问题,请参考以下文章