将大型DAG中的小任务群集到小型DAG中的大任务

时间:2018-07-17 06:43:48

标签: multithreading algorithm parallel-processing graph-theory directed-acyclic-graphs

我有3000多个顶点的任务DAG(有向无环图)(即:任务)。对于并行化,我想将微小的任务分组/群集为几个大型任务,这样任何群集任务都适合在线程上作为作业运行。该DAG已执行了数百万次,因此非常需要为多核处理找到有效的时间表。

(可选)上下文:首先,我第一步是在DAG中搜索断开连接的组件,然后在线程上启动组件。但是,我有900个顶点的一个非常大的连接组件,而其他大多数组件只有1到20个顶点。这个900个顶点的组件仍在大部分时间中使用:一个处理器内核负责该组件,而我的其他内核则并行处理其余2100个节点。其他2100项任务要比900项任务先完成,因此这个大的DAG是瓶颈。

问题:因此,我正在寻找一种算法,可以将DAG的这些微小任务聚类为更大的任务,同时保留语义。我是否缺少一些搜索术语?

简单示例:考虑以下任务-DAG:

    .--> B --> C --> D -.
   /                     \
  /                      |
 /                       v
A --> E --> F --> G ---> H --> I --> J

可以简化为:

    .--> (BCD) -.
   /             \
  /               |
 /                v
A ----> (EFG) --> H --> (IJ)

可以简化为:

    .--> (BCD) -.
   /             \
  /               |
 /                v
A ----> (EFG) --> (HIJ)

可以进一步缩小为:

(ABCDEFGHIJ)

请注意:

  • 最后一种情况是在单线程上集群任务。
  • 第一个DAG有太多微小的任务,并且将有很多线程同步开销。
  • 第二个DAG是一个很好的简化,因为它可以并行安排两件事。但是,它仍然具有H和IJ是两个单独的任务的缺点,可以将它们合并以避免同步开销。
  • 第三个DAG是一个很好的简化,因为它可以并行安排两件事。

更复杂的示例:在我的场景中,更实际的是遵循DAG结构。考虑100个任务A i 和B i ,其中B i 依赖于A i ,其中这100个实例化彼此独立。现在,一个任务C合并了这100个B i 任务的结果。

A_0 --> B_0 \
             \
A_1 --> B_1 -+
             |
A_2 --> B_2 -+--> C
             |
A_3 --> B_3 -+
             |
    ...
             |
A_99 -> B_99 /

第一个还原将A i 和B i 聚集成一个(AB) i

AB_0 \
      \
AB_1 -+
      |
AB_2 -+--> C
      |
AB_3 -+
      |
 ...
      |
AB_99 /

但是,DAG中仍然有100条并行路径。因为我只有n个(例如4个)处理器,所以我想将这100个并行路径聚集成n个作业(例如25个路径),这样我就节省了100个路径的同步开销,并且只有n个路径进行同步。

AB_[00..24] \
             \
AB_[25..49] -+
             |
AB_[50..74] -+--> C
             /
AB_[75..99] /

因此,在此示例中,我们从201个任务开始,并将它们合并为5个适合在4个线程上运行的任务。我想要的是这种智能的任务合并。

0 个答案:

没有答案