parallel_pipeline

[algorithms.parallel_pipeline]

パイプラインを実行する厳密にタイプが定められたインターフェイス。


// <oneapi/tbb/parallel_pipeline.h> ヘッダーで定義 

namespace oneapi { 
    namespace tbb { 

        void parallel_pipeline( size_t max_number_of_live_tokens, const filter<void,void>& filter_chain ); 
        void parallel_pipeline( size_t max_number_of_live_tokens, const filter<void,void>& filter_chain, task_group_context& context ); 

    } // namespace tbb 
} // namespace oneapi

parallel_pipeline アルゴリズムは、項目のストリームへのフィルターを含むパイプライン化された一連のアプリケーションを表します。各フィルターは、parallel、serial_in_order、または serial_out_of_order の特定のモードで動作します。

ファンクター g0g1g2、 . . . 、 gn からパイプラインをビルドして実行するには、次のようにします:


parallel_pipeline( max_number_of_live_tokens, 
                   make_filter<void,I1>(mode0,g0) & 
                   make_filter<I1,I2>(mode1,g1) & 
                   make_filter<I2,I3>(mode2,g2) & 
                   ... 
                   make_filter<In,void>(moden,gn) );

一般に、ファンクター giIi タイプのオブジェクトを Ii+1 タイプのオブジェクトにマップする operator() を定義すべきです。ファンクター g0 は入力ストリームの最後に達するとパイプラインに通知する特殊なケースです。ファンクター g0 は、flow_control オブジェクト fc に対して、g0 (fc ) 式が入力ストリームの次の値を返すか、または入力ストリームの最後に達した場合は fc.stop() を呼び出してダミー値を返すように定義する必要があります。

filter は 2 つのテンプレート引数で指定します。これらの引数はフィルターの入力タイプと出力タイプを定義します。最初と最後のフィルターは特殊なケースです。最初のフィルターの入力タイプと最後のフィルターの出力タイプは void である必要があります。

parallel_pipeline を渡す前に、filter::operator&() を使用してすべてのフィルターを one(filter<void, void>) に連結します。演算子では、左のオペランドの 2 番目のテンプレート引数が、2 番目のオペランドの最初のテンプレートと一致している必要があります。

並列に処理される項目の数は、パイプラインの構造と利用可能なスレッド数に依存します。max_number_of_live_tokens には、同時に処理される項目のしきい値を設定します。

context 引数が指定されている場合、パイプラインのタスクはこのコンテキストで実行されます。デフォルトでは、アルゴリズムは自身がバインドされているコンテキストで実行されます。

次の例は、parallel_pipeline を使用して、[first , last) で定義されるシーケンスの二乗平均平方根を計算します。


float RootMeanSquare( float* first, float* last ) { 
    float sum=0; 
    parallel_pipeline( /*max_number_of_live_token=*/16, 
        make_filter<void,float*>( 
            filter_mode::serial_in_order, [&](flow_control& fc)-> float*{ 
                if( first<last ) { 
                    return first++; 
                } else { 
                    fc.stop(); 
                    return nullptr; 
                } 
            } 
        ) & 
        make_filter<float*,float>( 
            filter_mode::parallel, 
            [](float* p){return (*p)*(*p);} 
        ) & 
        make_filter<float,void>( 
            filter_mode::serial_in_order, 
            [&](float x) {sum+=x;} 
        ) 
    ); 
    return sqrt(sum); 
}

filter クラス・テンプレート

flow_control クラス

参照: