インテル® マス・カーネル・ライブラリー 11.2 ユーザーズガイド

実行環境における競合の回避

特定の状況で、インテル® マス・カーネル・ライブラリー (インテル® MKL) でのスレッドの使用が問題となる競合が発生することがあります。このセクションでは、これらの問題が発生する理由と回避方法について簡単に説明します。

OpenMP* 宣言子を使用してプログラムをスレッド化し、インテル® コンパイラーを使用してプログラムをコンパイルした場合、そのプログラムとインテル® MKL はどちらも同じスレッド・ライブラリーを使用します。インテル® MKL はプログラムに並列領域が存在するかどうかを判断し、存在しても、ユーザーが MKL_DYNAMIC で指定しない限り、その処理を複数のスレッド上では行いません。 しかし、インテル® MKL が並列領域を認識できるのは、スレッド化プログラムとインテル® MKL が同じスレッド化を使用している場合のみです。プログラムがほかの手法でスレッド化されている場合、インテル® MKL はマルチスレッド・モードで動作しますが、リソースの浪費により適切なパフォーマンスが得られません。

以下の表は、問題と対応方法をスレッド化モデル別に示しています。

スレッド化モデル

説明

OS スレッド (Windows* の Win32* スレッド) を使用してプログラムをスレッド化する場合。

複数のスレッドがインテル® MKL を呼び出し、呼び出した関数がスレッド化されている場合、インテル® MKL のスレッド化をオフにする必要があります。利用可能な任意の手法を使用してスレッド数を設定します (「スレッド数を設定する手法」を参照)。

OpenMP* 宣言子またはプラグマを使用してプログラムをスレッド化し、インテル以外のコンパイラーを使用してプログラムをコンパイルする場合。

OMP_NUM_THREADS 環境変数の設定がコンパイラーのスレッド・ライブラリーと libiomp5 の両方に影響を与えるため、問題が発生する可能性がより高くなります。 この場合、インテル® MKL と使用する OpenMP コンパイラーのレイヤーが一致するように、スレッド・ライブラリーを選択してください (詳細は、「リンク例」を参照)。 選択できない場合、インテル® MKL をシーケンシャル・モードで使用してください。この際、適切なスレッド・ライブラリー(mkl_sequential.lib または mkl_sequential.dll) をリンクする必要があります (「上位ディレクトリー構造」を参照)。

例えば、マルチ CPU システムで、各プロセッサーをノードとして扱い、コミュニケーションに MPI を使用する複数の並列プログラムが動作している場合。

各プロセッサーで個別の MPI プロセスが実行されていても、スレッド・ソフトウェアはシステムに複数のプロセッサーが存在することを認識します。この場合、解決方法の 1 つは、利用可能な任意の手法を使用してスレッド数を設定することです (「スレッド数を設定する手法」を参照)。 ハイブリッド (OpenMP* + MPI) モードの場合の別の解決方法については、「Intel® Optimized MP LINPACK Benchmark for Clusters」を参照してください。

mkl_set_num_threads および mkl_domain_set_num_threads 関数は、グローバルな (つまり、すべてのスレッドに適用される) 変数を使用するため、並列ユーザースレッドでこれらの関数を使用してインテル® MKL の並列処理を制御すると、データ競合が発生してアプリケーションのパフォーマンスに影響することがあります。 例えば、並列ユーザースレッドでこれらの関数を呼び出して同じ関数ドメインに異なるスレッド数を設定した場合、実際に設定されるスレッド数は予測できません。このようなデータ競合を回避するには、mkl_set_num_threads_local 関数を使用します (関数の説明は、『インテル® MKL リファレンス・マニュアル』の「サポート関数」セクションを参照してください。

最適化に関する注意事項

インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804

関連情報


このヘルプトピックについてのフィードバックを送信