はじめに
Imatest ITには並列処理機能が搭載されています。 複数のプロセスを同時に実行することで、ユーザーがコンピュータのリソースをより有効に活用できるようにします。 Imatest ITには、親プロセスが解析対象の画像を子プロセスのプールに分配するマルチプロセス構成を示すC++プロジェクトが付属しています。このC++プロジェクトは、並行処理プールをオーケストレーションするために、特定の種類のプロセス間通信( Boost.Interprocessライブラリ)を利用しています。プロセス間制御オブジェクトと共有メモリを使用することで、親プロセスは子プロセスを安全に管理し、子プロセスが空き次第タスクを分配することができます。 並列テストにより、マシン1台あたりのテスト処理能力を最大2~3倍向上させることができます。以下にベンチマークの詳細を示します。 |
複数のプロセスを実行するメリット
|
多くのマルチコアマシンでは、単一のImatest ITモジュールを実行しても、コンピュータのリソースをすべて活用できるわけではありません。複数の解析プロセスを並列実行できるようにすることで(システムのリソースが飽和するまで)、テストのスループット、つまり一定時間内にマシンが実行できるテストの数を増やすことができます。 右側のグラフはその一例を示しています。このグラフでは、コンピュータ( Intel I7-3930Kプロセッサ、6コア@3.2GHz、16GB RAM)が、同時実行されるSFRplusプロセスの数を増やしながら、複数の8MP SFRplus画像を解析しています。この例では、ピーク時のテストスループットは、単一プロセスのテストスループットに比べて約3.7倍に増加しています。テストスループットは、プロセス数が物理コア数とほぼ等しくなる点で飽和状態に達しました。スループットの向上率は、コンピュータのプロセッサとRAM容量によって異なります。 |
|
Imatest IT並列処理サンプルプロジェクトの開始
背景情報
画像品質解析にはImatest IT/DLLが使用されますが、並列C++プロジェクトにおけるプロセス間通信と同期は、別のライブラリであるBoost Interprocessライブラリによって管理されます。Boost Interprocessライブラリはプロセス間ライブラリの唯一のものではありませんが、移植性と比較的シンプルな構造から選択されました。プロセス間通信と並行処理に関わる様々なオブジェクトを理解するには、 Boost Interprocessのドキュメントを参照してください。並列処理システムをプログラミングするには、並行処理の課題を理解することが不可欠です。
インストール
Imatest ITのインストールが完了すると、サンプル プロジェクトはITインストール ディレクトリ ( C:\Program Files\Imatest\v5.0\IT\ ) 内の\samples\cpp\CPP_parallel_test_project\サブ ディレクトリに配置されます。
Visual Studioプロジェクト
Imatest ITのインストールには、Visual Studio 2008 C++ プロジェクトが含まれています。このプロジェクトでは、Imatest ITの並列プロセス群が、ファイルとして保存された一連の画像を解析します。このプロセス群は、親プロセスによって管理され、親プロセスはBoost Interprocess C++ ライブラリ v1.54 の共有メモリと同期オブジェクトを使用してプールと通信します。共有メモリを介して、親プロセスはテストの詳細(画像ソース、画像に対して sfrplus_shell() または blemish_shell() を実行するかどうかなど)を個々の子プロセスに伝達します。子プロセスはテストを実行し、次の指示を待ちます。親プロセスは、子プロセスに対して実行すべきテストがなくなると、子プロセスを終了させるコマンドを送信します。
特徴
- 複数の解像度のSFRplusおよびBlemish RAW画像ファイルを解析します。
- 各子プロセスは、sfrplus_shell() 関数またはblemish_shell() 関数を使用して画像を解析できますが、2つの関数を切り替えるために再起動する必要はありません。
- 子プロセスは、画像の解析を完了すると、親プロセスからの指示を待ちます。
- 各子プロセスからのコンソール出力の衝突は、各子プロセスの出力を共有メモリ経由で親プロセスにリダイレクトすることによって抑制されます。
- 親プロセスは、子プロセスが十分な速さで結果を返さない場合、子プロセスを終了させ、新しい子プロセスを開始して、前のプロセスの画像を分析することができます。
- 親プロセスと特定の子プロセス間で共有されるデータへのアクセスは、 プロセス間ミューテックスとプロセス間条件変数によって制御されます。
ウィッシュリスト
- 親プロセスが、受信する画像が保存されているディレクトリ(または複数のディレクトリ)を監視し、待機中の子プロセスにそれらを割り当てるようにします。
C++プロジェクトのアーキテクチャ
C++プロジェクトでは、親プロセスが3つの子プロセスからなるプールを起動します。各子プロセスには 、Imatest IT/DLLのインスタンスが含まれています。テストデータ(画像ファイル名と実行するテスト内容など)は、共有メモリを介して子プロセスに配布されます。子プロセスは、.ini制御ファイルから入力された設定に基づいて画像を分析し、結果を固有の名前のJSONファイルに出力します。各子プロセスの出力は、本来であればコンソールウィンドウ(std::cout経由)に出力されるはずですが、コンソールへの出力の衝突を防ぐため、共有メモリを介して親プロセスにリダイレクトされます。子プロセスは画像分析が完了すると、親プロセスからの次の指示を待ちます。
重要なクラスとオブジェクト
子プロセス設定
この構造体は、各子プロセスと親プロセス間のインターフェースとして共有メモリにロードされます。この構造体には、実行するテストに関するすべての情報と、 プロセス間ミューテックスやプロセス間条件変数などの複数の制御構造が含まれています。Boost Interprocess共有メモリオブジェクトは、共有メモリに割り当てないため、標準C++コンテナを含めることはできません( リンク)。代わりに、 Boost Interprocessコンテナまたは通常のデータオブジェクトを使用してください。
子ハンドル
このクラスを使用すると、親プロセスは子プロセスと共有メモリの ChildProcessSettings 構造体をより適切に制御できます。このクラスが必要な理由は、子プロセスが親プロセスによって終了された場合(例えば、子プロセスが停止した場合など)、ChildProcessSettings 構造体を含む共有メモリを削除し、新しい共有メモリオブジェクトを作成する必要があるためです。
SfrTestStruct
この構造体には、特定のSFRplusテストに関するすべての情報(ファイル名など)が含まれています。
ブレミッシュテスト構造
この構造体には、特定の傷検査に関するすべての情報(ファイル名など)が含まれています。
カメラ情報
この構造体には、カメラの解像度、シリアル番号、部品番号など、特定のカメラに関するすべての識別情報が含まれています。
さらに読む
- Boost Interprocess のドキュメント。
- 共有メモリ内のマッピングされた領域の制限に関する重要な注意点:( リンク)。



