【问题标题】:Running multiple tasks in parallel with dependencies与依赖项并行运行多个任务
【发布时间】:2015-01-30 22:09:06
【问题描述】:

我有许多“站点”(m),每个站点都必须处理一个事件(数据块。所有这些都可以在开始时使用)。每个事件(其中 n 个)被发送到每个站点进行处理。所以你可能认为我有 nxm 任务。处理的顺序并不重要,只是一个站点一次不能处理多个事件(因此 Task(m,x) 不能与 Task(m,y) 并行运行)

目前它在网站上使用“OMP 并行 for”实现,嵌套在事件的常规 for 循环中

for(...event...)
#pragma omp parallel for
    for(...site...)
        site.process(event)

这工作正常,但并非所有网站对每个事件都具有相同的复杂性。即所有站点都必须等待最慢的站点才能继续下一个事件。我估计如果我允许工人继续下一个活动,我可以节省两倍。

实现这一点的最佳方法是什么?我正在使用 C++ 我正在研究 TBB Flow Graph,或多条管道......

另一个考虑是每个“事件”都必须从磁盘读取,并占用一点内存。虽然还不是很关键,但我希望一次在系统中拥有尽可能少的事件(或限制它们)。在当前的实现中,我只有一个(加上在后台准备的一对) 谢谢

【问题讨论】:

  • 你没有提到任何依赖。站点 A 能否在站点 B 开始之前完成所有任务 1..n?
  • 是的。也许依赖不是最好的词。限制并行化...?所以,是的,我可以让每个站点处理所有事件,然后转移到下一个站点。这只是颠倒了 2 个 for 循环的顺序(将内部循环与并行 for 分开)但是我并不喜欢这个解决方案,因为准备(读取)所有事件 m 次的开销。
  • 你还需要这个问题的答案吗?
  • 是的。我希望这是在 tbb 中处理的标准问题,只需要定义约束。但是,如果我必须编写管理器并分配和释放资源,则推迟到以后。

标签: c++ parallel-processing tbb tbb-flow-graph


【解决方案1】:

我会使用一个管理器进程来跟踪每一侧的已处理事件(m*n bool 矩阵)和当前“正在使用”的事件。

每个站点都以“随机”事件开始。 经理循环浏览站点以检查他们是否完成了当前事件,并在可能的情况下分配一个新事件。

C++11 为此类任务提供了std::async

每个进程调用都是异步完成的,您可以循环访问相应的未来元素以检查它们是否完成 (wait_for)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多