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

同カテゴリーの次の記事

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

この記事は、インテル® ソフトウェア・ネットワークに掲載されている「OMP Abort: Initializing libguide40.dll but found libiomp5md.dll already initialized」の日本語参考訳です。
この記事では、次のようなエラーが発生した場合の対処方法を説明しています。
エラー:

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 […]
  • インテル® IPP における OpenMP* サポートの変更インテル® IPP における OpenMP* サポートの変更 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「OpenMP support changes in Intel Performance libraries […]
  • マルチスレッド開発ガイド: 4.6 インテル® Parallel Composer を利用して並列コードを開発するマルチスレッド開発ガイド: 4.6 インテル® Parallel Composer を利用して並列コードを開発する コードの並列化にはさまざまな手法があります。この記事では、インテル® Parallel Composer で利用可能な手法の概要を説明し、各手法の主な長所を比較します。インテル® Parallel Composer は Windows* 上の C/C++ を使用した開発のみを対象としていますが、これらの手法の多くは Fortran や […]
  • データとコードの並べ替え: 最適化とメモリー – パート 2データとコードの並べ替え: 最適化とメモリー – パート 2 この記事は、インテル® デベロッパー・ゾーンに公開されている「Putting Your Data and Code in Order: Data and layout - Part 2」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 パフォーマンスとメモリーに関するこのシリーズ (全 2 […]
  • OpenMP* 4.x による新しいレベルの並列化 (全2回)OpenMP* 4.x による新しいレベルの並列化 (全2回) 2015年 12月に東京で開催されたインテル® ソフトウェア・カンファレンス Day 1 で、iSUS 編集長 すがわら きよふみが講演した内容を基に、2部にわけて「OpenMP* 4.x による新しいレベルの並列化」についてお届けします。Part 1 では、複数レベルの並列性を活用するための Code […]