TBB中的数据流图和依赖图有什么区别
What's the difference between data flow graph and dependence graph in TBB
我已经从
Intel TBB Tutorial,感觉这两个概念有点混乱
我能说 data flow graph
和 dependence graph
的主要区别在于是否有显式共享资源吗?
但似乎我们可以使用带有伪消息的 function_node
来实现 dependence graph
,或者使用带有共享全局变量的 continue_node
来实现 data flow graph
。
function_node
接受 continue_msg
输入和 continue_node
之间的区别在于接收消息时的行为。这是 "dependence graph."
概念的结果
依赖图的思想是图传递的唯一信息是任务的完成。如果你有四个任务(A、B、C、D)都在同一个共享数据上运行,并且任务 A 和 B 必须在 C 或 D 可以开始之前完成,你定义四个 continue_nodes
,并附上节点 A 到 C 和 D 的输出,B 也是如此。您还可以创建一个 broadcast_node<continue_msg>
并将 A 和 B 作为其后继者。 (计算中使用的数据必须可以通过其他方式访问。)
要开始绘制图表,您需要从 continue_msg
到 broadcast_node
执行 try_put
。 broadcast_node
向每个后继者(A 和 B)发送一个 continue_msg
。
continue_nodes
A 和 B 各有 1 个前驱(broadcast_node
。)在收到等于其前驱计数 (1) 的 continue_msgs
后,它们将排队等待执行,使用和更新表示计算状态的数据。
当 continue_node
A 完成时,它向每个后继节点 C 和 D 发送一个 continue_msg
。这些节点每个都有两个前任节点,所以它们 而不是 在收到此消息时执行。他们只记得他们收到了一条消息。
当 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。
- 节点 A 将完成,并将
continue_msgs
传递给 C 和 D。
- 收到
continue_msg
后,任务将排队执行 C 和 D 的 function_bodies。
- 节点B将完成执行,并将
continue_msg
转发给C和D。
- C 和 D 在收到第二个 continue_msg 后,将排队执行他们的 function_bodies 第二次任务。
通知 3. 以上。 function_node
每次收到 continue_msg
时都会做出反应。 continue_node
知道它有多少个前驱,只有当它收到的 continue_msgs
等于它的前驱数时才会做出反应。
如果在计算中使用了很多状态,并且任务的顺序很好理解,则依赖图很方便。 "shared state" 的想法并不一定要求使用依赖图,但是依赖图只能传递所涉及工作的完成状态,因此必须使用共享状态来传递其他数据。
(请注意,我上面描述的完成顺序只是一种可能的顺序。节点 B 可以在节点 A 之前完成,但操作顺序是相似的。)
我已经从 Intel TBB Tutorial,感觉这两个概念有点混乱
我能说 data flow graph
和 dependence graph
的主要区别在于是否有显式共享资源吗?
但似乎我们可以使用带有伪消息的 function_node
来实现 dependence graph
,或者使用带有共享全局变量的 continue_node
来实现 data flow graph
。
function_node
接受 continue_msg
输入和 continue_node
之间的区别在于接收消息时的行为。这是 "dependence graph."
依赖图的思想是图传递的唯一信息是任务的完成。如果你有四个任务(A、B、C、D)都在同一个共享数据上运行,并且任务 A 和 B 必须在 C 或 D 可以开始之前完成,你定义四个 continue_nodes
,并附上节点 A 到 C 和 D 的输出,B 也是如此。您还可以创建一个 broadcast_node<continue_msg>
并将 A 和 B 作为其后继者。 (计算中使用的数据必须可以通过其他方式访问。)
要开始绘制图表,您需要从 continue_msg
到 broadcast_node
执行 try_put
。 broadcast_node
向每个后继者(A 和 B)发送一个 continue_msg
。
continue_nodes
A 和 B 各有 1 个前驱(broadcast_node
。)在收到等于其前驱计数 (1) 的 continue_msgs
后,它们将排队等待执行,使用和更新表示计算状态的数据。
当 continue_node
A 完成时,它向每个后继节点 C 和 D 发送一个 continue_msg
。这些节点每个都有两个前任节点,所以它们 而不是 在收到此消息时执行。他们只记得他们收到了一条消息。
当 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。- 节点 A 将完成,并将
continue_msgs
传递给 C 和 D。 - 收到
continue_msg
后,任务将排队执行 C 和 D 的 function_bodies。 - 节点B将完成执行,并将
continue_msg
转发给C和D。 - C 和 D 在收到第二个 continue_msg 后,将排队执行他们的 function_bodies 第二次任务。
通知 3. 以上。 function_node
每次收到 continue_msg
时都会做出反应。 continue_node
知道它有多少个前驱,只有当它收到的 continue_msgs
等于它的前驱数时才会做出反应。
如果在计算中使用了很多状态,并且任务的顺序很好理解,则依赖图很方便。 "shared state" 的想法并不一定要求使用依赖图,但是依赖图只能传递所涉及工作的完成状态,因此必须使用共享状态来传递其他数据。
(请注意,我上面描述的完成顺序只是一种可能的顺序。节点 B 可以在节点 A 之前完成,但操作顺序是相似的。)