グラフを表現するヘルパー関数

説明

グラフを表現するヘルパー関数#

この機能を有効にするには、TBB_PREVIEW_FLOW_GRAPH_FEATURES マクロを 1 に定義します。

ヘルパー関数は、フローグラフの作成を簡潔にすることを目的としています。

説明#

この機能により、make_edgesmake_node_setfollowsprecedes 関数がoneapi::tbb::flow 名前空間に追加されます。これらの関数は、ノードをセットに集めてグラフ内の他のノードに接続できるようにすることで、フローグラフのビルドプロセスを簡素化します。

API#

#

以下のグラフを考えてみましょう。

../../_images/fg_api_graph_structure.png

この例では、C++17 クラス・テンプレート引数推論を使用して、可能な限りテンプレート・パラメーターの指定を回避しています。

通常の 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& v) { 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(); 
}

プレビュー 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& v) { 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(); 
}