0

まず、「リアルタイム」ということで、このアプリでは画像の画像処理に0.1秒以下かかるはずです。

このアプリケーションでは、メイン スレッドに加えて 3 つのスレッドが実行されています。1 つは画像取得、2 番目は画像処理、3 番目はロボットです。2 つのスレッドの間には、共有する画像キューがあるため、カメラが画像をキューに入れ、ロボットが処理済み画像をキューから取り出し、画像プロセッサが画像をキューから取り出し、処理済み画像をキューに入れます。お気づきかもしれませんが、1 つの制限として、処理された画像は順番に並べる必要があります。つまり、画像の取得と同じ順序で画像を保持する必要があります。

このアーキテクチャに適用する設計パターンまたはベスト プラクティスはありますか。

4

2 に答える 2

4

パイプとフィルターパターンはこれに適しています。

  • 取得フィルターは順番にシリアルである必要があります。
  • 処理フィルターは並行して実行できます。
  • ロボットへのトランスポートフィルターは、順番にシリアルである必要があります。

既存のテクノロジーでこれを実現するために、大量のデータを処理するリアルタイムアプリケーションが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は、フィルターのデータ順序/スレッド化を制御する機能を提供しながら、パターンをアルゴリズムから切り離すパイプおよびフィルターパターンの優れた実装リファレンスとして機能します。

于 2012-08-18T16:28:22.050 に答える
1

あなたのアプローチは正しいと思います。

考えられる改善は、たとえば画像処理のためのスレッドプールの使用である可能性があります(特に取得よりもはるかに時間がかかる場合)。OpenMPを検討するか、スレッドプールをブーストするか、boost :: asio::io_serviceを検討することができます。

于 2012-08-18T14:10:53.347 に答える