如何使具有依赖性的任务的节点图并行化

时间:2018-09-16 12:43:24

标签: c++ multithreading algorithm

我有任务的有向无环图(DAG),其中有向边表示依赖项。为了并行执行任务,我尝试了一些技术,但是我想提供最佳方法的建议。

这是一个示例图形,其中包含任务ABCD。总有1个终端节点。在实际应用中,图可能有数千个节点。

         C ---.
               \
A ----------------> D
   \           /
    `--> B ---`
  • A没有依赖关系;它可以立即运行
  • B取决于A是否先完成。因此,如果它与A在同一线程上运行,则无需等待。如果它与A位于不同的线程上,则需要同步。
  • C没有依赖性,因此可以立即运行
  • D取决于ABC,其完成标志着整个图的完成

我尝试了几种简易的方法,这些方法可以正常工作,但是我觉得这是一个问题,已经存在最佳解决方案了

具体来说,这是Windows上的C ++音频应用程序,节点图表示将在缓冲区上连续运行的DSP电路。因此,例如,到目前为止,我发现的最佳技术根据图中节点的时间为N个线程生成了一个执行计划。该计划可以生成一次,然后循环执行。


编辑

到目前为止,我尝试过的最好的技术是执行以下操作:

  1. 将图按拓扑排序到列表中
  2. 对节点进行配置,以了解它们需要执行多长时间。
  3. 生成执行计划。使用N个工作线程,以相反的方式逐个任务(因此,从终端节点开始)“填写”其计划。在依赖导致等待的地方,这是时间表中的空白。
  4. 现在,当图形运行时,我们只需遵循计划,并且仅在为不同线程计划节点的依赖项时才需要等待。

我尝试的另一种技术是仅允许工作人员从拓扑排序的列表中请求下一个可用节点。这是快速的方法,但与提前制定计划并不相近。

我认为我的解决方案不是最优的原因是因为有许多方法可以对图进行拓扑排序,这将产生不同的执行计划。因此,即使我的方法是最优的,我的实现也可能不是因为我暂时没有任何优化策略来生成列表。

我认为等待时间最少的执行计划是最佳选择,但是我觉得我在不断完善自己。

0 个答案:

没有答案