【问题标题】:Aggregation node in TBBTBB中的聚合节点
【发布时间】:2018-02-05 16:44:12
【问题描述】:

我是 TBB 的新手,所以我很抱歉,如果这个问题很明显......但是我如何设置一个带有 TBB 的聚合节点?在所有预制节点中,我找不到合适的类型。

假设我有一个传入的图像流。我想要一个不断接受图像(带有 FIFO 缓冲区)的节点,对它们进行一些计算(即它需要一个内部状态),并且每当它接收到 N 个图像(固定参数)时,它就会发出一个结果。

【问题讨论】:

  • 我的用例一模一样,既然你没有接受任何答案,你有没有找到更好的解决方案?如果可以,可以分享一下吗?

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


【解决方案1】:

我认为 TBB 流程图中没有这样的奇异节点,它通过某种预处理进行累积,然后,当累积完成后,将其结果转发给后继者。 但是,我相信使用多个节点可以达到效果。例如,将queue_node 视为图中的起点。它将用作具有 FIFO 语义的缓冲区。之后是 multifunction_node 和 N 个输出。该节点将进行实际的图像预处理并将结果发送到与图像编号相对应的输出端口。然后是join_node,它的所有 N 个输入都连接到multifunction_node 的相应输出。最后将有一个join_node 的后继者,它将接收 N 个图像作为其输入。由于join_node 将其输入聚合在一个元组中,因此在数字 N 相对较大的情况下可以很快看出这种设计的缺点。

另一个变体可能具有相同的queue_nodefunction_node 连接,具有无限并发作为后继(function_node 应该进行一些图像预处理),然后有一个具有串行并发的multifunction_node(意思是一次只能运行其主体的单个实例),这将累积图像并在达到数字 N 时从主体内部执行 try_put 调用其继任者。

当然,还有其他变体如何通过使用其他流程图拓扑来实现所需的行为。顺便说一句,要将这样的图制作为单个节点,可以使用composite_node 将子图表示为单个节点。

【讨论】:

  • 将 queue_node 放在无限的 function_node 之前实际上是没有用的,因为后者从不拒绝它的输入。如果保持一定的顺序很重要(例如视频流中帧的顺序),那么最好在无限“计算器”和串行“聚合器”之间放置一个 sequencer_node。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多