我已阅读过有关data flow graph
和dependence graph
的信息
Intel TBB Tutorial,对这两个概念感到有些困惑。
我可以说data flow graph
和dependence graph
之间的主要区别在于是否有明确的共享资源?
但似乎我们可以使用dependence graph
使用伪消息实现function_node
,或使用共享全局变量data flow graph
实现continue_node
。
答案 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作为后继附加到它。 (计算中使用的数据必须通过其他方式访问。)
要启动图表,您需要try_put
continue_msg
broadcast_node
。 broadcast_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
的反应将为
broadcast_node
会将continue_msg
转发给A和B,并且每个人都会执行他们的function_bodies。continue_msgs
传递给C和D. continue_msg
后,任务将排队等候执行C和D的function_bodies。continue_msg
转发给C和D. 上述通知3. function_node
每次收到continue_msg
时都会做出反应。 continue_node
知道它有多少个前辈,只有当它收到的continue_msgs
个数等于它的前辈数时才会做出反应。
如果在计算中使用了很多状态,并且如果很好地理解了任务序列,则依赖图很方便。 &#34;共享状态&#34;的想法并不一定要求依赖图的使用,但依赖图不能传递任何东西,除了所涉及的工作的完成状态,因此必须使用共享状态来传递其他数据。
(请注意,我上面描述的完成顺序只是一种可能的顺序。节点B可以在节点A之前完成,但操作顺序类似。)