インテル® MKL 2017 デベロッパー・ガイド
特定の状況で、インテル® MKL でのスレッドの使用が問題となる競合が発生することがあります。このセクションでは、これらの問題が発生する理由と回避方法について簡単に説明します。
プログラムがインテルの OpenMP* ランタイム・ライブラリー (RTL) またはインテル® TBB RTL 以外の手法でスレッド化されている場合、インテル® MKL のいくつかの呼び出しはマルチスレッド・モードで同時に動作するかもしれませんが、リソースの浪費により適切なパフォーマンスが得られません。
以下の表は、問題と対応方法をスレッド化モデル別に示しています。
スレッド化モデル |
説明 |
---|---|
インテルの OpenMP* およびインテル® TBB 以外の手法 (例: Windows® 上の Win32® スレッド) を使用してプログラムを並列化する場合 |
複数のスレッドがインテル® MKL を呼び出し、呼び出した関数がスレッド化されている場合、インテル® MKL のスレッド化をオフにする必要があります。利用可能な任意の手法を使用してスレッド数を設定します (「スレッド数を設定する手法」を参照)。 |
OpenMP* ディレクティブ/プラグマを使用してプログラムを並列化し、インテル以外のコンパイラーでコンパイルする場合 |
複数のスレッド RTL が同時に作業しないように、使用するコンパイラーに一致するインテル® MKL スレッド・ライブラリーにプログラムをリンクします (詳細は、「リンク例」を参照)。選択できない場合、インテル® MKL をシーケンシャル・モードで使用してください。この際、適切なスレッド・ライブラリー (mkl_sequential.lib または mkl_sequential.dll) をリンクする必要があります (「付録 C: 詳細なディレクトリー構造」を参照)。 |
インテル® TBB スレッディング・テクノロジーを使用してプログラムをスレッド化し、インテル以外のコンパイラーでコンパイルする場合 |
複数のスレッド RTL が同時に作業しないように、使用するコンパイラーに一致するインテル® MKL のインテル® TBB スレッド・ライブラリーとインテル® TBB RTL にプログラムをリンクします 選択できない場合、インテル® MKL をシーケンシャル・モードで使用してください。この際、適切なスレッド・ライブラリー (mkl_sequential.lib または mkl_sequential_dll.lib) をリンクする必要があります (「付録 C: 詳細なディレクトリー構造」を参照)。 |
マルチプロセッサー・システムでインテル® MKL を呼び出す複数のプログラムを実行し、メッセージ・パッシング・インターフェイス (MPI) によりプログラムを並列化する場合。 |
複数のプログラムのスレッド RTL を実行すると、システムの 1 つのプロセッサーに多数のスレッドが配置され、リソースを浪費することがあります。この場合、解決方法の 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 デベロッパー・リファレンス』の「Support Functions」セクションを参照してください。
最適化に関する注意事項 |
---|
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。 注意事項の改訂 #20110804 |