TBB中的数据流图和依赖图有什么区别

What's the difference between data flow graph and dependence graph in TBB

我已经从 Intel TBB Tutorial,感觉这两个概念有点混乱

我能说 data flow graphdependence 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_msgbroadcast_node 执行 try_putbroadcast_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 的反应将是

  1. broadcast_nodecontinue_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 第二次任务。

通知 3. 以上。 function_node 每次收到 continue_msg 时都会做出反应。 continue_node 知道它有多少个前驱,只有当它收到的 continue_msgs 等于它的前驱数时才会做出反应。

如果在计算中使用了很多状态,并且任务的顺序很好理解,则依赖图很方便。 "shared state" 的想法并不一定要求使用依赖图,但是依赖图只能传递所涉及工作的完成状态,因此必须使用共享状态来传递其他数据。

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