如何计算DAG中的最大并行度?

时间:2017-08-22 06:24:33

标签: algorithm graph directed-acyclic-graphs

给定DAG(有向无环图),如何计算最大并行度?

瞬时并行性是算法执行中每个点可以保持忙碌的最大处理器数量; 最大并行度是最高的瞬时并行性。

换句话说,假设DAG表示任务的依赖关系图,那么最小的处理器/线程数是多少,以至于没有任何任务被阻止?

我发现here最接近的方法是:

  • 在DAG上应用拓扑排序
  • 按拓扑顺序遍历节点,计算最小级别:
    • 没有父母:0
    • 否则:最低父级别+ 1
  • 返回最大级别宽度(分配相同级别的最大节点数)

这个算法适用于几个样本,但不适用于树。 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查找关键路径长度的解决方案,即最大并行度是不正确的,因为它仅适用于示例的子集,主要是叶子数等于最长的树路径。以下是一个不起作用的案例说明:

enter image description here

编辑2:

@ AliSultani使用BFS找到具有最大节点数的级别的第二个解决方案,并将该max设置为最大并行度也是不正确的,因为它没有考虑来自不同级别的节点可以并发运行的情况。看到这个反例:

enter image description here

3 个答案:

答案 0 :(得分:1)

此问题可以归结为Maximum Directed Cut问题。

让我们从原来的DAG构建一个辅助DAG。

  1. 对于原始图表的每个顶点u[i],将顶点v[i]w[i]添加到新图表中,并使用边(v[i], w[i])连接它们,费用为{{1} }}。
  2. 对于原始图表的每个边1,向新图表添加成本为(u[i], u[j])的边(w[i], v[j])
  3. 现在问题相当于在辅助图中找到最大定向切割。
  4. 示例:

    enter image description here

答案 1 :(得分:0)

您应该在DAG中找到critical path length。关键路径是有针对性的 DAG中所有其他路径中具有最大执行要求的路径。在具有n个节点的DAG中的critical path length具有n个节点。因此maximal parallelismn

从根到叶(在DAG中)的关键路径为longest path,为了找到它,您可以使用 BFS 算法(Breath First Search)。

示例1

BFS

此树中的

BFS orderO(|V|+|E|)。这是此问题的最佳解决方案。

编辑:通过BFS查找最大并发度

您也可以通过运行广度优先搜索算法来确定最大并发度:

  • 算法从根节点开始并继续向 叶子水平。
  • 在检查位于下一级别的节点之前,它会探索所有节点 属于相同级别的节点。
  • 计算每个级别上的节点数并更新变量保持 每个级别的最大节点数。

示例2(逐步)

Step1

Step2

Step3

Step4

因此,在此示例中,最大并发度为4。

最终修改

根据您提供的最后一个解释,Maximal independent set任务就是您要找的。要解决此问题,请参阅this article

答案 2 :(得分:0)

我尚未测试算法,但是我的建议如下:

  1. 从原始节点开始。
  2. 选择每个连接的边。当前并发是所选边的数量。记住这一点。
  3. 按出站边数对通过边连接的所选节点进行排序。忽略所有尚未选择入站边缘的节点。
  4. 从边缘最外的节点开始沿着边缘下降。
  5. 如果不在末端节点:从2开始重复
  6. 获取所有迭代的当前并发最大值。

Here是python中使用networkx的一种实现。您链接的文档有一些不同之处。当以附加的时间将图形执行到节点时,它计算并发任务数(在这种情况下,每个节点1个)。这是一项简单的任务,可能是文档作者所提到的任务。但是,我的算法会计算理论最大值,并且没有考虑每个任务的运行时间。