インテル® MKL 11.3 ユーザーズガイド

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

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

プログラムがインテルの OpenMP* ランタイム・ライブラリー (RTL) またはインテル® TBB RTL 以外の手法でスレッド化されている場合、インテル® MKL のいくつかの呼び出しはマルチスレッド・モードで同時に動作するかもしれませんが、リソースの浪費により適切なパフォーマンスが得られません。

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

スレッド化モデル

説明

インテルの OpenMP* またはインテル® TBB 以外の手法 (例: Windows* 上の Win32* スレッド) を使用してプログラムを並列化する場合

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

OpenMP* 宣言子/プラグマを使用してプログラムを並列化し、インテル以外のコンパイラーでコンパイルする場合

複数のスレッド RTL が同時に作業しないように、使用するコンパイラーに一致するインテル® MKL スレッド・ライブラリーにプログラムをリンクします (詳細は、「リンク例」を参照)。 選択できない場合、インテル® MKL をシーケンシャル・モードで使用してください。この際、適切なスレッド・ライブラリー(mkl_sequential.lib または mkl_sequential.dll) をリンクする必要があります (「詳細なディレクトリー構造」を参照)。

インテル® TBB スレッディング・テクノロジーを使用してプログラムをスレッド化し、インテル以外のコンパイラーでコンパイルする場合

複数のスレッド RTL が同時に作業しないように、使用するコンパイラーに一致するインテル® MKL のインテル® TBB スレッド・ライブラリーとインテル® TBB RTL にプログラムをリンクします 選択できない場合、インテル® MKL をシーケンシャル・モードで使用してください。この際、適切なスレッド・ライブラリー(mkl_sequential.lib または mkl_sequential.dll.lib) をリンクする必要があります (「詳細なディレクトリー構造」を参照)。

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

改訂 #20110804

関連情報