0

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

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

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

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

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

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

4

1 回答 1

0

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

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

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

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

于 2014-09-09T15:37:03.673 回答