特定の状況で、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のスレッドが問題となる競合が発生することがあります。このセクションでは、これらの問題が発生する理由と回避方法について簡単に説明します。
プログラムがインテルの OpenMP* ランタイム・ライブラリー (RTL) またはインテル® TBB RTL 以外の手法でスレッド化されている場合、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のいくつかの呼び出しはマルチスレッド・モードで同時に動作するかもしれませんが、リソースの浪費により適切なパフォーマンスが得られません。
以下の表は、問題と対応方法をスレッド化モデル別に示しています。
スレッド化モデル |
説明 |
|---|---|
インテルの OpenMP* およびインテル® TBB 以外の手法 (例: Linux* 上の pthread) を使用してプログラムを並列化する場合。 |
複数のスレッドがインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を呼び出し、呼び出した関数がスレッド化されている場合、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のスレッド化をオフにする必要があります。利用可能な任意の手法を使用してスレッド数を設定します (スレッド数を設定する方法を参照)。 |
OpenMP* ディレクティブ/プラグマを使用してプログラムを並列化し、インテル以外のコンパイラーでコンパイルする場合 |
複数のスレッド RTL が同時に作業しないように、使用するコンパイラーに一致するインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のスレッド・ライブラリーにプログラムをリンクします (詳細は、リンクの例を参照)。これが不可能な場合は、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) をシーケンシャル・モードで使用します。この際、適切なスレッド・ライブラリー (libmkl_sequential.a または libmkl_sequential.so) をリンクする必要があります (付録 C: 詳細なディレクトリー構造を参照)。 |
oneTBB のスレッド・テクノロジーを使用してプログラムをスレッド化し、インテル以外のコンパイラーでコンパイルする場合。 |
複数のスレッド RTL が同時に動作しないように、使用するコンパイラーに一致するインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) の oneTBB スレッド・ライブラリーと oneTBB RTL にプログラムをリンクします。これが不可能な場合は、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) をシーケンシャル・モードで使用します。この際、適切なスレッド・ライブラリー (libmkl_sequential.a または libmkl_sequential.so) をリンクする必要があります (付録 C: 詳細なディレクトリー構造を参照)。 |
マルチプロセッサー・システムでインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を呼び出す複数のプログラムを実行し、メッセージ・パッシング・インターフェイス (MPI) によりプログラムを並列化する場合。 |
複数のプログラムのスレッド RTL を実行すると、システムの 1 つのプロセッサーに多数のスレッドが配置され、リソースを浪費することがあります。この場合、解決方法の 1 つは、利用可能な任意の手法を使用してスレッド数を設定することです (「スレッド数を設定する手法」を参照)。ハイブリッド (OpenMP* + MPI) モードにおける別のソリューションについては、インテル® ディストリビューションの LINPACK ベンチマークを参照してください。 |
mkl_set_num_threads および mkl_domain_set_num_threads 関数は、グローバルな (つまり、すべてのスレッドに適用される) 変数を使用するため、並列ユーザースレッドでこれらの関数を使用してインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) の並列処理を制御すると、データ競合が発生してアプリケーションのパフォーマンスに影響することがあります。例えば、並列ユーザースレッドでこれらの関数を呼び出して同じ関数ドメインに異なるスレッド数を設定した場合、実際に設定されるスレッド数は予測できません。このような状況を回避するには、mkl_set_num_threads_local 関数を使用します (関数の説明は、『インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) デベロッパー・リファレンス』の「Support Functions」セクションを参照してください)。
製品および性能に関する情報 |
|---|
性能は、使用状況、構成、およびその他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex (英語) をご覧ください。 改訂 #20201201 |