我有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结构。考虑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个线程上运行的任务。我想要的是这种智能的任务合并。