フローグラフの基本: タスクへのノードのマッピング

次の図は、前のセクションで説明した 2 つのノードグラフの例の実行タイムラインを示しています。n および m のボディーは、それぞれ λn および λm と呼びます。try_put の 3 回の呼び出しは 3 つのタスクをスポーンし、それぞれ 3 つの入力メッセージの 1 つにラムダ式 λn を適用します。n の同時実行数は unlimited であるため、十分なスレッドが利用可能であれば、これらのタスクは同時に実行できます。グラフで実行するタスクがなくなるまで、g.wait_for_all() の呼び出しはブロックされます。インテル® TBB のほかの wait_for_all 関数と同様、wait_for_all を呼び出すスレッドは、この間アイドル状態で待機するのではなく、ワークプールのほかのタスクを実行することができます。

2 つのノードグラフの実行タイムライン

mn のサクセサーであるため、n からのタスクが終了すると、出力を m にプットします。ノード n とは異なり、m は同時実行数を 1 に制限して作成されているため、すべてのタスクを直ちにスポーンしません。代わりに、メッセージが到着した順に、ボディー λm を実行するタスクを順番にスポーンします。すべてのタスクが完了すると、wait_for_all の呼び出しがリターンします。

フローグラフの実行はすべて非同期に行われます。try_put を呼び出すと、直ちにタスクをスポーンするか、渡されたメッセージをバッファーした後、呼び出しスレッドに制御を返します。同様に、ボディータスクはラムダ式を実行し、すべてのサクセサーノードへ結果を送ります。wait_for_all の呼び出しのみブロックします。このケースでも、待機している間、呼び出しスレッドはインテル® TBB ワークプールのほかのタスクを実行することができます。

上記のタイムラインは、並列に実行できるすべてのタスクを実行するのに十分なスレッドがある場合のシーケンスを示しています。スレッド数が少ない場合、スポーンされるいくつかのタスクで、スレッドが利用できるようになるまで待つ必要があります。

関連情報