0

TBB フロー グラフの条件付き実行を読みましたが、少し異なる問題があります。

複数の入力と複数の出力を持つノードを作成し、条件変数によって実行を制御することは可能ですか? 多分醜いキャストなしで。

グラフをどのように設計したいかの簡単な例を添付しました。TBBフローグラフで実行する最良の方法は?

  1. start_nodeに送信start_msgしますsome_node

  2. start_msgが空の場合は にsome_node送信continue_msgend_node、そうでない場合はそれ自体に AND を送信some_nodeしますcontinue_msgdata_msgend_node

  3. continue_msgが によって受信された場合some_node、前の start_msg が空であるかどうかがチェックされます。空の場合は acontinue_msgが に送信されend_node、そうでない場合は a が送信されdata_msgます。

                         +--continue_msg--+
                         |                |
                         +-----+    +-----+
                               |    |
                               |    |   +----data_msg---+
                               v    |  /                 \
    start_node --start_msg--> some_node                    end_node
                                       \                  /
                                        +--continue_msg--+
    

私が対処している 1 つの問題:start_msgサイズがわかっている場合でも、内部に適切な要素がいくつあるかはわかりません (たとえばstart_msg、 が a を保持しているとします。が悪い要素を見つけたtbb::concurrent_vector<T>場合、それは無視され、それ自体に a を送信しています。some_nodesome_nodecontinue_msg

4

1 に答える 1

1

source_nodeアルゴリズムで使用できるようです。source_node必要な数のメッセージを生成できます。したがって、アルゴリズムを少し作り直すことができます。

source_node -> ... -> end_node

continue_msgを に送信する必要があるのはなぜend_nodeですか? 最後のメッセージをマークするには?std::pair<T,bool>おそらく、最初の要素がデータで、2 番目の要素が最後のメッセージを示すa を使用できます。

の Body は、source_nodeで有効な要素を見つけ、tbb::concurrent_vector<T>新しいメッセージを作成し、Body 呼び出しごとmake_pair(Data, false)に戻ります。trueコンテナから最後の要素が抽出されると、コンテナが作成され、最後の要素の表示としてmake_pair(Data, true)返されます。false

残念ながら、私は元のアルゴリズムを知らないため、私の提案は不適切である可能性があります。ニーズに合わない場合は、詳細を教えていただけますか?

于 2016-08-04T13:48:23.203 に答える