0

I have read about data flow graph and dependence graph from the Intel TBB Tutorial, and feel a bit confusing about these two concepts.

Can I say that the key difference between data flow graph and dependence graph is whether there are explicitly shared resources or not?

But it seems that we can implement a dependence graph using function_node with pseudo messages, or implement a data flow graph using continue_node with shared global variables.

4

1 回答 1

3

function_nodea接受continue_msg输入和 a之间的区别在于continue_node接收消息时的行为。这是“依赖图”概念的结果。

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

示例依赖图

要开始图表,您try_put对. 将a 发送给每个后继者(A 和 B)。continue_msgbroadcast_nodebroadcast_nodecontinue_msg

continue_nodesA 和 B 各有 1 个前驱(broadcast_node.)在接收到continue_msgs等于其前驱计数 (1) 的数量时,它们将排队执行、使用和更新表示计算状态的数据。

continue_nodeA 完成时,它会向continue_msg每个后继节点 C 和 D 发送一个。这些节点每个都有两个前驱节点,因此它们在收到此消息时不会执行。他们只记得他们收到了一条消息。

continue_nodeB 完成时,它还会向continue_msgC 和 D 发送 a。这将是continue_msg每个节点接收到的第二个,因此任务将排队执行它们的 function_bodies。

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

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

  1. broadcast_nodea 转发continue_msg给 A 和 B,它们将各自执行其 function_bodies。
  2. 节点 A 将完成,并传递continue_msgs给 C 和 D。
  3. 收到 后continue_msg,任务将排队执行 C 和 D 的函数体。
  4. 节点 B 将完成执行,并将 a 转发continue_msg给 C 和 D。
  5. C 和 D 在接收到第二个 continue_msg 后,会将任务排队以第二次执行其 function_bodies。

注意 3. 上面。function_node每次continue_msg收到. 知道它有continue_node多少个前置任务,并且只有在它收到的数量continue_msgs等于它的前置任务数量时才会做出反应。

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

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

于 2015-01-30T18:58:24.680 回答