parallel_pipeline 関数

概要

パイプライン実行用の厳密な型のインターフェイス。

ヘッダー

#include "tbb/pipeline.h"

構文

void parallel_pipeline( size_t max_number_of_live_tokens, 
                        const filter_t<void,void>& filter_chain
                        [, task_group_context& group] );

説明

parallel_pipeline 関数は、パイプラインの構築および実行用の厳密な型のラムダ・フレンドリーなインターフェイスです。パイプラインの特性は、クラスの派生の代わりにファンクターによってパイプラインのステージが指定されることを除いて、pipeline クラスに似ています。

ファンクター 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) );

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

max_number_of_live_tokens 値は、pipeline::run の場合と同じ意味があります。

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

サンプル

次のサンプルは、parallel_pipeline を使用して、[ first , last ) で定義されるシーケンスの二乗平均平方根を計算します。このサンプルは、構文の構造を示すことのみを目的としています。並列オーバーヘッドが大きすぎるため、実際の計算には適していません。& 演算子では、第 1 引数 filter_t の出力の型が第 2 引数 filter_t の入力の型と一致していなければなりません。

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

parallel_pipeline の重要な例については、インテル® TBB のチュートリアルを参照してください。

関連情報