パイプとフィルターパターンはこれに適しています。
- 取得フィルターは順番にシリアルである必要があります。
- 処理フィルターは並行して実行できます。
- ロボットへのトランスポートフィルターは、順番にシリアルである必要があります。
既存のテクノロジーでこれを実現するために、大量のデータを処理するリアルタイムアプリケーションがIntelのスレッディングビルディングブロック(TBB)を使用しているのを見てきました。スレッドビルディングブロックチュートリアルの「組立ラインでの作業:パイプライン」セクションでは、同様の問題について説明しています。
単純なテキスト処理の例を使用して、並列フォーマットを実行するためのパイプラインとフィルターの使用法を示します。この例では、テキストファイルを読み取り、テキスト内の各10進数を二乗し、変更されたテキストを新しいファイルに書き込みます。[...]rawファイルのI/Oがシーケンシャルであると想定します。二乗フィルターは並行して行うことができます。つまり、n
チャンクを非常に高速にシリアルに読み取ることができる場合n
は、出力ファイルに適切な順序で書き込まれている限り、各チャンクを並列に変換できます。
そして付随するコード:
void RunPipeline( int ntoken, FILE* input_file, FILE* output_file ) {
tbb::parallel_pipeline(
ntoken,
tbb::make_filter<void,TextSlice*>(
tbb::filter::serial_in_order, MyInputFunc(input_file) )
& tbb::make_filter<TextSlice*,TextSlice*>(
tbb::filter::parallel, MyTransformFunc() )
& tbb::make_filter<TextSlice*,void>(
tbb::filter::serial_in_order, MyOutputFunc(output_file) ) );
}
TBBが使用されているかどうかに関係なく、TBBは、フィルターのデータ順序/スレッド化を制御する機能を提供しながら、パターンをアルゴリズムから切り離すパイプおよびフィルターパターンの優れた実装リファレンスとして機能します。