0

我有一个需要处理的文件来源。从每个文件中,我的代码生成可变数量的数据对象,我们称它为 N。我有 K 个处理对象,可用于处理 N 个数据对象。

我正在考虑使用 Tbb:dataflow 执行以下操作:

  1. 创建一个并发K的function_node并将我的K个处理对象放入concurrent_queue。
  2. 使用 input_node 读取文件,生成 N 个数据对象,并将每个数据对象 try_put 放入 function_node。
  3. function_node 主体将处理对象出列,使用它来处理数据对象,然后在完成后将处理对象返回给 concurrent_queue。

我能想到的另一种方式可能是这样的:

  1. 创建一个具有串行并发性的 function_node。
  2. 使用 input_node 读取文件,生成 N 个数据对象,将数据对象放入一个集合并发送到 function_node。
  3. 在 function_node 处,将 N 个对象划分为 K 个范围,并使用 K 个处理对象中的每一个来同时处理每个范围 - 不确定是否可以为此目的自定义 parallel_for。

第一种方法的优点可能是延迟较低,因为我可以在数据对象生成的那一刻开始通过数据流发送数据对象,而不必等待所有 N 个数据对象都生成。

您认为并行处理此处理的最佳方法是什么?

4

1 回答 1

0

是的,您是对的,第一种方法具有不需要等待所有数据对象开始处理的优点。但是,它还有一个优点,即无需等待处理完所有传递给 的数据对象parallel_for。如果每个数据对象和/或每个处理对象的处理速度不同,这将变得特别明显。

buffer_node此外,后面跟着 (也许, reserving)join_node而不是concurrent_queue保存处理对象以供进一步重用似乎就足够了。在这种情况下,一旦完成数据对象的处理,function_node就会返回处理对象。buffer_node因此,图表将如下所示:

input_node     ->  input_port<0>(join_node);
buffer_node    ->  input_port<1>(join_node);
join_node      ->  function_node;
function_node  ->  buffer_node;

在这种情况下,function_node可以保留并发性,unlimited因为它会自动跟随图中存在的处理对象的数量(可用令牌)。

另外,请注意,从不同文件生成数据对象也可以并行完成。如果您从中受益,请考虑使用function_node而不是,input_node因为后者始终是串行的。但是,在这种情况下,使用join_nodewith queueingpolicy sincefunction_node是不可保留的。

另外,请考虑使用tbb::parallel_pipeline代替,因为您似乎有一个经典的流水线处理方案。特别是,这个那个链接可能很有用。

于 2020-04-11T20:08:18.707 回答