情報詳細Q:HALCON(HDevEngine)でループ処理をする際に、1回目の処理時間が長くなることを防ぎたいです。A:まず、HALCONで1回目のループ実行時に処理時間が長くなる原因を説明し、その後に対策について説明します。1回目のループ実行時に処理時間が長くなる原因は、実行に必要なメモリを確保する処理が入るためです。これには、HALCONが実行するのに必要な初期化リソースと、オペレータ実行時に必要な(都度確保される)メモリの2つがあります。 HALCONが実行するのに必要な初期化リソースとは、具体的にはHALCONメモリマネージメントシステムの初期化、画像データベースの初期化、AOPや内部処理のスレッドプールの初期化、HALCONコアシステムの初期化を指します。これらは、そのプロセスで最初に実行されるHALCONのオペレータ内で、確保が行われます。 すべての初期化を一度にやるので時間がかかります。またこれを仕様としてうたっています。オペレータ実行時に必要なメモリとは、[global memory, Image memory, temporary memory] の3種類を指します。これらに関する詳しい説明はナレッジ番号4704 "HALCONメモリマネージメントについて" を参照してください。 これらの確保が行われるため、HALCONの実行時間が伸びてしまいます。このとき、1回目実行時のループ時間を短くする一番簡単な方法は、事前に一度ダミー処理を実行することです。ここでいうダミー処理とは実際にループする処理と同じオペレータを同じ順番で実行することを指します。このとき、画像などオブジェクトを入力に用いる場合は、実際の処理となるべく同じような画像のほうが良いです。少なくとも画像サイズは同じにしてください。"同じような"と書いている理由は、たとえばマッチング処理を行う場合、入力画像の複雑さによって結果的に必要となるメモリサイズが異なるためです。ダミー処理の再現が不可能な場合(例えば条件分岐が多い場合)は、順番通りでなくても良いので、実行されうるオペレータをすべて事前に実行しておいてください。これにより処理時間の増大をある程度軽減することが出来ます。global memory と temporary memory は事前に確保することは出来ませんが、Image memoryは 「set_system ('image_cache_capacity', XXX)」を実行することで事前に確保することが出来ます。このとき、キャッシュは時間経過によって解放されることはありません。また、オペレータの実行が終了すると、不要になったメモリは特定のスレッドのキャッシュに追加され、そのスレッドが別のオペレータを実行する際に使用することができます。HALCONでは処理に必要なメモリ量がわかっていたとしても、各スレッドは独自の一時メモリキャッシュを持っているため、オペレータの自動並列化に使用されるスレッドそれぞれについて、必要となる一時メモリキャッシュにメモリを事前に割り当てることはできません。また、処理時間が長くなる原因は、キャッシュの他にも様々な理由が考えられます。OpenGLやOpenCLなどの追加ライブラリがオペレータの初回実行時までに完全にロードされていない場合や、OSがHALCONライブラリ全体をメモリにロードしていない場合などにも処理時間は長くなります。添付ファイルタイトルHALCON(HDevEngine)でループ処理をする際に、1回目の処理時間が長くなることを防ぎたい。URL 名000008055公開状況公開済み検証状況公開済み