• 2021.4
  • 09/27/2021
  • Public Content
Contents

Helper Functions for Expressing Graphs

To enable this feature, define the
TBB_PREVIEW_FLOW_GRAPH_FEATURES
macro to 1.
Helper functions are intended to make creation of the flow graphs less verbose.

Description

This feature adds
make_edges
,
make_node_set
,
follows
and
precedes
functions to
oneapi::tbb::flow
namespace. These functions simplify the process of building flow graphs by allowing to gather nodes into sets and connect them to other nodes in the graph.

Example

Consider the graph depicted below.
In the examples below, C++17 Class Template Argument Deduction is used to avoid template parameter specification where possible.
Regular API
#include <oneapi/tbb/flow_graph.h> int main() { using namespace oneapi::tbb::flow; graph g; broadcast_node<int> input(g); function_node doubler(g, unlimited, [](const int& v) { return 2 * v; }); function_node squarer(g, unlimited, [](const int&) { return v * v; }); function_node cuber(g, unlimited, [](const int& v) { return v * v * v; }); join_node<std::tuple<int, int, int>> join(g); int sum = 0; function_node summer(g, serial, [&](const std::tuple<int, int, int>& v) { int sub_sum = std::get<0>(v) + std::get<1>(v) + std::get<2>(v); sum += sub_sum; return sub_sum; }); make_edge(input, doubler); make_edge(input, squarer); make_edge(input, cuber); make_edge(doubler, std::get<0>(join.input_ports())); make_edge(squarer, std::get<1>(join.input_ports())); make_edge(cuber, std::get<2>(join.input_ports())); make_edge(join, summer); for (int i = 1; i <= 10; ++i) { input.try_put(i); } g.wait_for_all(); }
Preview API
#define TBB_PREVIEW_FLOW_GRAPH_FEATURES 1 #include <oneapi/tbb/flow_graph.h> int main() { using namespace oneapi::tbb::flow; graph g; function_node doubler(g, unlimited, [](const int& v) { return 2 * v; }); function_node squarer(g, unlimited, [](const int&) { return v * v; }); function_node cuber(g, unlimited, [](const int& v) { return v * v * v; }); auto handlers = make_node_set(doubler, squarer, cuber); broadcast_node input(precedes(handlers)); join_node join(follows(handlers)); int sum = 0; function_node summer(follows(join), serial, [&](const std::tuple<int, int, int>& v) { int sub_sum = std::get<0>(v) + std::get<1>(v) + std::get<2>(v); sum += sub_sum; return sub_sum; }); for (int i = 1; i <= 10; ++i) { input.try_put(i); } g.wait_for_all(); }

Product and Performance Information

1

Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.