【发布时间】: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