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

同カテゴリーの次の記事

インテル® IPP における OpenMP* サポートの変更

この記事は、インテル® ソフトウェア・ネットワークに掲載されている「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* サポートの変更」もあわせてご参照ください。

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

関連記事

  • Parallel Universe マガジンParallel Universe マガジン Parallel Universe へようこそ。 米国インテル社が四半期に一度オンラインで公開しているオンラインマガジンです。インテルの技術者によるテクノロジーの解説や、最新ツールの紹介など、並列化に関する記事を毎号掲載しています。第1号からのバックナンバーを PDF 形式で用意しました、ぜひご覧ください。 12 […]
  • OpenMP* を使用して既存のシリアルコードで並列処理の可能性を見つけようOpenMP* を使用して既存のシリアルコードで並列処理の可能性を見つけよう この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Finding Non-trivial Opportunities for Parallelism in Existing Serial Code using […]
  • インテル® IPP における OpenMP* サポートの変更インテル® IPP における OpenMP* サポートの変更 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「OpenMP support changes in Intel Performance libraries […]
  • C++ 開発者が陥りやすい OpenMP* の 32 の罠C++ 開発者が陥りやすい OpenMP* の 32 の罠 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「32 OpenMP traps for C++ developers」 (http://software.intel.com/en-us/articles/32-openmp-traps-for-c-developers/) […]
  • LLVM の OpenMP* サポート、参加方法、FAQLLVM の OpenMP* サポート、参加方法、FAQ この記事は、GitHub* の LLVM で公開されている 2022年10月19日現在の「Support, Getting Involved, and FAQ」を、インテル社の許可を得て iSUS (IA Software User Society) […]