任意のタスクアリーナにフローグラフをアタッチ

任意のタスクアリーナにフローグラフをアタッチ#

oneTBB の task_arena インターフェイスは、優先する計算ユニットを設定したり、計算ユニットの一部を制限したり、アリーナの並行実行を制限することで、アリーナ内でのタスク実行をガイドするメカニズムを提供します。場合によっては、フローグラフの実行時にこのようなメカニズムを適用することがあります。

構築中に、graph オブジェクトがアリーナに接続され、構築中のスレッドがスロットを占有します。

この例では、最もパフォーマンスの高いコアタイプをグラフ実行の優先コアタイプとして設定する方法を示します。

std::vector<tbb::core_type_id> core_types = tbb::info::core_types(); 
tbb::task_arena arena( 
    tbb::task_arena::constraints{}.set_core_type(core_types.back()) 
); 

arena.execute( [&]() { 
    graph g; 
    function_node< int > f( g, unlimited, []( int ) { 
        /*最もパフォーマンスの高いコアタイプが優先として定義されます*/ 
    } ); 
    f.try_put(1); 
    g.wait_for_all(); 
} );

graph オブジェクトは、graph::reset() 関数を呼び出すことで別の task_arena に再接続できます。graph を再初期化し、タスクアリーナのインスタンスに再接続します。その中で graph::reset() メソッドが実行されます。

この例では、最もパフォーマンスの高いコアタイプをワーク実行の優先タイプとして既存のグラフをアリーナに再接続する方法を示します。グラフの代わりにタスクが作成されるたびに、そのタスクは、そのタスクが属するグラフのアリーナ内で作成され、タスクが作成されたスレッドのアリーナは無視されます。

 graph g; 
function_node< int > f( g, unlimited, []( int ) { 
    /*最もパフォーマンスの高いコアタイプが優先として定義されます*/
} ); 

std::vector<tbb::core_type_id> core_types = tbb::info::core_types(); 
tbb::task_arena arena( 
    tbb::task_arena::constraints{}.set_core_type(core_types.back()) 
); 

arena.execute( [&]() { 
    g.reset(); 
} ); 
f.try_put(1); 
g.wait_for_all();

詳細については、次のトピックを参照してください。