同時実行を制限

同時実行を制限#

単一ノードのインスタンスの数を制御するには、ノードの同時実行制限を使用できます。同時実行制限に達した後にメッセージを拒否するには、「拒否」ノードとして構築します。

関数ノードは、1 つ以上のテンプレート引数を使用して構築されます。3 番目の引数は、ノードが使用するバッファーポリシーを制御しますが、デフォルトではキューイングになります。キューイング・ポリシーでは、同時実行制限に達した function_node は引き続き受信メッセージを受け入れて、それらを内部的にバッファリングします。ポリシーが拒否に設定されている場合、ノードは受信メッセージを拒否します。

template < typename Input, 
           typename Output = continue_msg, 
           graph_buffer_policy = queueing > 
class function_node;

例えば、グラフ内で処理中の大きなオブジェクトの数を制御するには、input_node の下流に拒否する function_node を以下のように配置します。

graph g; 

int src_count = 0; 
int number_of_objects = 0; 
int max_objects = 3; 

input_node< big_object * > s( g, [&]( oneapi::tbb::flow_control& fc ) -> big_object* { 
    if ( src_count < M ) { 
        big_object* v = new big_object(); 
        ++src_count; 
        return v; 
    } else { 
        fc.stop(); 
        return nullptr; 
    } 
} ); 
s.activate(); 

function_node< big_object *, continue_msg, rejecting > f( g, 3, 
    []( big_object *v ) -> continue_msg { 
    spin_for(1); 
    delete v; 
    return continue_msg(); 
} ); 

make_edge( s, f ); 
g.wait_for_all();

function_node は、最大 3 つの大きなオブジェクトを同時に操作します。ノードの並列実行しきい値は、ノードが同時に実行できる呼び出しを 3 つに制限します。function_node が 3 つのインスタンスを同時に実行している場合、input_node からの受信メッセージを拒否し、input_node は最後に作成されたオブジェクトをバッファリングし、そのボディー・オブジェクトの呼び出しを一時的に停止します。function_node が同時実行制限を下回ると、input_node から新しいメッセージが取得されます。最大 4 つの大きなオブジェクトが同時に存在し、function_node に 3 つ、input_node にバッファリングされた 1 つになります。