1

Threading Building Blocks (TBB) は初めてです。TBB ノードを使用して次のロジックを実装する必要があります。

タイプ N のノードは 2 つの入力を受け取ります。例: 1. std::vector // データ 2. bool // フラグ

これらの入力は非同期で行われます。

入力がタイプ 1 の場合、タイプ N のノードが所有するデータを処理して、次のような 2 つの出力を生成します。std::vector b. 整数

入力がタイプ 2 の場合、タイプ N のノードが所有するデータを処理して、std::vector などの 1 つの出力を生成します。

tbb::flow::or_node を使用して入力部分を作成し、tbb::flow::multifunction_node を使用して出力部分を作成しようとしています。

入力が 1 つだけで出力が複数ある場合、このロジックは tbb::flow::multifunction_node で記述できます (テスト済みで動作します)。1 つの出力と複数の入力がある場合、ソリューションを示すコードの例を見つけました。ただし、複数の非同期入力と複数の出力のケースを TBB フレームワークでどのように実装できるかは明確ではありません。提案を歓迎します。

4

1 に答える 1

3

or_node の現在の実装で、やりたいことができるはずです。(or_node の出力をより使いやすくするために再設計していますが、or_node コミュニティ プレビュー機能の問題については、あなたのようなユーザーからの入力が必要です。)

覚えておくべきことの 1 つは、or_node を使用してコードをコンパイルするときに CPF をオンにすることです。スイッチは -DTBB_PREVIEW_GRAPH_NODES=1 です。

# define TBB_PREVIEW_GRAPH_NODES 1  // necessary to turn on the or_node community Preview Feature.
#include "tbb/flow_graph.h"
#include <vector>

using namespace tbb::flow;

// The output format of the or_node is a struct that contains
//   1. the index of the input that the message appeared on, and
//   2. a tuple, the (i-1)th element of which is the message received

typedef or_node<tuple<std::vector<double>, bool> > my_or_node_type;

// it wasn't clear from the description if you wanted to differentiate between the vectors output with
// an input of type 1. or type 2.  If you need to do that you can add an extra output port to the multifunction_node.
typedef multifunction_node<my_or_node_type::output_type, tuple<std::vector<double>, int> > my_mf_node_type;

struct mf_node_body {
    void operator()(const my_or_node_type::output_type &in, my_mf_node_type::output_ports_type &op) {
        switch(in.indx) {
        case 0: {
                // do the operation for the first input (the std::vector) The vector will be in
                // get<0>(in.result).  Remember you are copying vectors here, so if you have big
                // vectors you will probably want to do some buffer management on your own and
                // pass refs to the vector instead.
            }
            break;
        case 1: {
                // do the operation signaled by the second input (the bool.)  The value of the
                // input is in get<1>(in.result).
            }
            break;
        }
    }
};


main() {
    graph g;
    my_or_node_type multi_in(g);
    my_mf_node_type multi_out(g, unlimited, mf_node_body());

    // if the vector-producing node is called vpn, you attach it to the 0-th input of the or_node with
    //     make_edge(vpn, input_port<0>(multi_in));
    //
    // the bool-producing node bn can be attached similarly:
    //     make_edge(bn, input_port<1>(multi_in);
    //
    // attach the multi-in to the multi-out:
    //     make_edge(multi_in, multi_out);
    //
    // attach the vector consumer node vcn
    //     make_edge(output_port<0>(multi_out), vcn);
    //
    // attach the integer output to the int consuming node icn
    //     make_edge(output_port<1>(multi_out), icn);
    // 
    // start up the graph and make sure to do a wait_for_all() at the end.
}

multifunction_node 本体は並行して呼び出されるため、実行する作業に競合状態があってはならないことに注意してください (何らかの理由で競合状態が必要serialな場合を除きます) unlimited。グラフを安全に破棄できるようにする唯一の方法は、ノードを実行しているタスクがないことを確認することです。これを行う最善の方法は、g.wait_for_all().

よろしく、クリス

PS - 1 つの補遺。multifunction_node が定義されserialている場合、明示的に除外しない限り、入力バッファーがあります。バッファが存在することを期待していない場合、これによりグラフの動作が変わる可能性があります。

于 2013-11-20T20:19:59.477 に答える