OMP Abort エラーが発生した場合の対処方法

インテル® DPC++/C++ コンパイラーインテル® Fortran コンパイラーインテル® Parallel Studio XE
この記事は、インテル® ソフトウェア・ネットワークに掲載されている「OMP Abort: Initializing libguide40.dll but found libiomp5md.dll already initialized」 (http://software.intel.com/en-us/articles/opm-abort-initializing-libguide40dll/) の日本語参考訳です。
この記事では、次のようなエラーが発生した場合の対処方法を説明しています。
エラー:

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 がすでに初期化済みであることが発見されました。 )

このケースには次の複数の回避策があります。

  1. libiomp5 ライブラリーを使用する ICC 11 を使って、OpenCV ライブラリーをリビルドします。これにより、競合は発生しなくなります。
  2. IPP の PATH をシステム環境変数またはランタイム環境から削除して、OpenCV が IPP ライブラリーを使用しないようにします。
  3. ライブラリーの競合を無視するように、KMP_DUPLICATE_LIB_OK=TRUE 環境変数を設定します。ただし、この方法は推奨しません。
  4. 最新の 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* サポートの変更」もあわせてご参照ください。

また、本記事にて取り上げられている問題は、旧バージョンのコンパイラーあるいはライブラリーを使用してビルドされたモジュールが含まれることが原因となります。最新環境へ移行される場合には、最新版のコンパイラーおよびライブラリーをご利用いただくことをお勧めします。評価版のダウンロード、お問い合わせはエクセルソフト株式会社まで。

タイトルとURLをコピーしました