给定DAG(有向无环图),如何计算最大并行度?
瞬时并行性是算法执行中每个点可以保持忙碌的最大处理器数量; 最大并行度是最高的瞬时并行性。
换句话说,假设DAG表示任务的依赖关系图,那么最小的处理器/线程数是多少,以至于没有任何任务被阻止?
我发现here最接近的方法是:
这个算法适用于几个样本,但不适用于树。 E.g:
o 0
/ \
o 1 o 1
/ \
o 2 o 2
/ \
o 3 o 3
根据上面的算法,最大宽度为2,但树中的最大平行度显然是叶子的数量,在上面的例子中为4。
类似的方法部分描述here(参见标题为Computing critical path etc.
的幻灯片,其中描述了如何计算节点的最早开始时间以及“可以从此计算出最大...并行度”)
编辑1:
@ AliSoltani使用BFS查找关键路径长度的解决方案,即最大并行度是不正确的,因为它仅适用于示例的子集,主要是叶子数等于最长的树路径。以下是一个不起作用的案例说明:
编辑2:
@ AliSultani使用BFS找到具有最大节点数的级别的第二个解决方案,并将该max设置为最大并行度也是不正确的,因为它没有考虑来自不同级别的节点可以并发运行的情况。看到这个反例:
答案 0 :(得分:1)
此问题可以归结为Maximum Directed Cut问题。
让我们从原来的DAG构建一个辅助DAG。
答案 1 :(得分:0)
您应该在DAG中找到critical path length
。关键路径是有针对性的
DAG中所有其他路径中具有最大执行要求的路径。在具有n个节点的DAG中的critical path length
具有n个节点。因此maximal parallelism
为n
。
从根到叶(在DAG中)的关键路径为longest path
,为了找到它,您可以使用 BFS 算法(Breath First Search)。
示例1
此树中的 BFS order
为O(|V|+|E|)
。这是此问题的最佳解决方案。
编辑:通过BFS查找最大并发度
您也可以通过运行广度优先搜索算法来确定最大并发度:
示例2(逐步)
因此,在此示例中,最大并发度为4。
最终修改
根据您提供的最后一个解释,Maximal independent set任务就是您要找的。要解决此问题,请参阅this article。
答案 2 :(得分:0)
我尚未测试算法,但是我的建议如下:
Here是python中使用networkx的一种实现。您链接的文档有一些不同之处。当以附加的时间将图形执行到节点时,它计算并发任务数(在这种情况下,每个节点1个)。这是一项简单的任务,可能是文档作者所提到的任务。但是,我的算法会计算理论最大值,并且没有考虑每个任务的运行时间。