Parallelizing Data Flow and Dependence Graphs# Parallelizing Data Flow and Dependency Graphs Basic Flow Graph Concepts Flow Graph Basics: Graph Object Flow Graph Basics: Nodes Flow Graph Basics: Edges Flow Graph Basics: Mapping Nodes to Tasks Flow Graph Basics: Message Passing Protocol Flow Graph Basics: Single-push vs. Broadcast-push Flow Graph Basics: Buffering and Forwarding Flow Graph Basics: Reservation Graph Application Categories Data Flow Graph Dependence Graph Predefined Node Types Flow Graph Tips and Tricks Flow Graph Tips for Waiting for and Destroying a Flow Graph Always Use wait_for_all() Avoid Dynamic Node Removal Destroying Graphs That Run Outside the Main Thread Flow Graph Tips on Making Edges Use make_edge and remove_edge Sending to One or Multiple Successors Communication Between Graphs Using input_node Avoiding Data Races Flow Graph Tips on Nested Parallelism Use Nested Algorithms to Increase Scalability Use Nested Flow Graphs Flow Graph Tips for Limiting Resource Consumption Using limiter_node Use Concurrency Limits Create a Token-Based System Attach Flow Graph to an Arbitrary Task Arena Guiding Task Scheduler Execution Work Isolation Flow Graph Tips for Exception Handling and Cancellation Catching Exceptions Inside the Node that Throws the Exception Cancel a Graph Explicitly Use graph::reset() to Reset a Canceled Graph Canceling Nested Parallelism Estimating Flow Graph Performance