この記事では、次のようなエラーが発生した場合の対処方法を説明しています。
エラー:
OMP abort: Initializing libguide40.dll, but found libiomp5md.dll already initialized. (libguide40.dll の初期化時に libiomp5md.dll がすでに初期化済みであることが発見されました。 )
この問題により、パフォーマンスの低下を引き起こすことがあります。
この場合、プログラムを続行させる場合は、環境変数 KMP_DUPLICATE_LIB_OK=TRUE を設定してください。
原因:libiomp5md.dll および libguide40.dll はどちらもインテルの OpenMP* ランタイム・ライブラリーです。libiomp5md.dll は新しいインテルの OpenMP* 互換ライブラリーであり、libguide40.dll は以前の OpenMP* ライブラリーです。 インテル® IPP 6.x およびインテル® コンパイラー 11.x のマルチスレッド・ライブラリーでは、従来の OpenMP* ランタイム・ライブラリー (libguide*) を互換ライブラリー (libiomp*) へ切り替えています。
注: スタティック OpenMP* ライブラリーは、インテル® Parallel Studio 2011 では削除されています。そのため、このような問題はインテル® Parallel Studio 2011 以降のバージョンでは回避可能です。インテル® Parallel Studio 2011 の OpenMP ライブラリーを参照してください。
ダイナミック・ライブラリー libguide40.dll は、下位互換性のために現バージョンにも含まれていますが、将来のバージョンでは提供されなくなります。
このエラーは、複数の OpenMP* ライブラリーが同一アプリケーションでリンクされるために起こります。例えば、アプリケーションがインテル® IPP 6.x の libiomp5md.dll へリンクし、同時に他のソフトウェア (例: サードパーティーのライブラリー) へもリンクし、そのソフトウェアが libguide40.dll へリンクしている場合、OpenMP* ランタイム・ライブラリーの初期化が重複するため、このエラーが起こります。
解決方法:いずれかを削除して、OpenMP* ランタイム・ライブラリーを 1 つだけにしてください。
libguide40 は将来なくなるため(バージョン12.0以降には含まれません)、libiomp5md.dll を使用し、配布することを推奨します。
以前のバージョンのインテル® IPP を使用しているサードパーティーのライブラリーについては、このような問題を避けるため、libiomp5md.dll を使用してリビルドすることを強く推奨します。
テストケース:
次に例を示します。
インテル® コンパイラー 11.0 プロフェッショナル・エディションで OpenCV 1.0 を使用してアプリケーションをビルドすると、ビルドには成功しますが、次のエラーが発生して実行することができません。
OMP: Error #15: Initializing libiomp5md.dll, but found libguide40.lib already initialized. (libguide40.dll の初期化時に libiomp5md.dll がすでに初期化済みであることが発見されました。 )
このケースには次の複数の回避策があります。
- libiomp5 ライブラリーを使用する ICC 11 を使って、OpenCV ライブラリーをリビルドします。これにより、競合は発生しなくなります。
- IPP の PATH をシステム環境変数またはランタイム環境から削除して、OpenCV が IPP ライブラリーを使用しないようにします。
- ライブラリーの競合を無視するように、KMP_DUPLICATE_LIB_OK=TRUE 環境変数を設定します。ただし、この方法は推奨しません。
- 最新の OpenCV バージョン 1.1pre1 を使用します。このライブラリーは Microsoft* OpenMP* ライブラリー “vcomp.dll” でビルドされており、インテルの OpenMP* ライブラリー “libiomp5md.dll” と互換性があります。そのため、OpenCV と IPP6.x を使用すると、エラーは起こりません。
編集部追加
インテル® コンパイラーの OpenMP* ランタイム・ライブラリーは、C++/Fortran コンパイラーの自動並列化オプション /Qparallel (Windows* 版)、-parallel (Linux* 版、Mac OS* X 版)、または OpenMP* オプション /Qopenmp (Windows* 版)、-openmp (Linux* 版、Mac OS* 版) を使用した場合、あるいはインテル® MKL またはインテル® IPP をマルチスレッド・バージョンでリンクした場合に必要になります。
本記事に関連する情報として、こちらの記事「インテル® IPP における OpenMP* サポートの変更」もあわせてご参照ください。
また、本記事にて取り上げられている問題は、旧バージョンのコンパイラーあるいはライブラリーを使用してビルドされたモジュールが含まれることが原因となります。最新環境へ移行される場合には、最新版のコンパイラーおよびライブラリーをご利用いただくことをお勧めします。評価版のダウンロード、お問い合わせはエクセルソフト株式会社まで。