TBB中数据流图和依赖图之间的区别是什么

时间:2015-01-30 04:24:42

标签: tbb control-flow-graph tbb-flow-graph

我已阅读过有关data flow graphdependence graph的信息 Intel TBB Tutorial,对这两个概念感到有些困惑。

我可以说data flow graphdependence graph之间的主要区别在于是否有明确的共享资源?

但似乎我们可以使用dependence graph使用伪消息实现function_node,或使用共享全局变量data flow graph实现continue_node

1 个答案:

答案 0 :(得分:3)

function_node接受continue_msg输入和continue_node之间的差异是接收消息时的行为。这是"依赖图的概念的结果。"

依赖图的概念是图表传递的唯一信息是任务的完成。如果您有四个任务(A,B,C,D)都在相同的共享数据上运行,并且在启动C或D之前必须完成任务A和B,则定义四个continue_nodes并附加节点A到C和D的输出,以及B的输出。您也可以创建一个broadcast_node<continue_msg>并将A和B作为后继附加到它。 (计算中使用的数据必须通过其他方式访问。)

example dependence graph

要启动图表,您需要try_put continue_msg broadcast_nodebroadcast_node向每个后继者(A&amp; B)发送continue_msg

continue_nodes A和B每个都有1个前任(broadcast_node。)在接收到等于其前任计数(1)的continue_msgs个数时,它们排队等待执行,使用并更新表示计算状态的数据。

continue_node A完成时,它会向每个后继者发送continue_msg,C&amp; D.这些节点每个都有两个前驱,因此它们在接收此消息时执行。他们只记得他们收到了一条消息。

continue_node B完成时,它还会向C和D发送continue_msg。这将是每个节点接收的第二个continue_msg,因此任务将排队以执行其function_bodies。

continue_nodes仅使用图表来表达此顺序。没有数据从节点传输到节点(超出了前任完成的信号。)

如果图表中的节点function_nodes接受continue_msgs而不是continue_nodes,则broadcast_node获得continue_msg的反应将为

  1. broadcast_node会将continue_msg转发给A和B,并且每个人都会执行他们的function_bodies。
  2. 节点A将完成,并将continue_msgs传递给C和D.
  3. 收到continue_msg后,任务将排队等候执行C和D的function_bodies。
  4. 节点B将完成执行,并将continue_msg转发给C和D.
  5. C和D,在接收到第二个continue_msg时,会将任务排队,以便第二次执行它们的function_bodies。
  6. 上述通知3. function_node每次收到continue_msg时都会做出反应。 continue_node知道它有多少个前辈,只有当它收到的continue_msgs个数等于它的前辈数时才会做出反应。

    如果在计算中使用了很多状态,并且如果很好地理解了任务序列,则依赖图很方便。 &#34;共享状态&#34;的想法并不一定要求依赖图的使用,但依赖图不能传递任何东西,除了所涉及的工作的完成状态,因此必须使用共享状态来传递其他数据。

    (请注意,我上面描述的完成顺序只是一种可能的顺序。节点B可以在节点A之前完成,但操作顺序类似。)