特定の状況で、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のスレッドが問題となる競合が発生することがあります。このセクションでは、これらの問題が発生する理由と回避方法について簡単に説明します。
プログラムがインテルの OpenMP* ランタイム・ライブラリー (RTL) またはインテル® TBB RTL 以外の手法でスレッド化されている場合、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のいくつかの呼び出しはマルチスレッド・モードで同時に動作するかもしれませんが、リソースの浪費により適切なパフォーマンスが得られません。
次の表では、競合が発生する可能性のあるいくつかのケースを検討し、スレッドモデルに応じた推奨事項を示します。
スレッド化モデル |
説明 |
|---|---|
インテルの OpenMP* およびインテル® TBB 以外の手法 (例: Windows* 上の Win32 スレッド) を使用してプログラムを並列化する場合。 |
複数のスレッドがインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を呼び出し、呼び出した関数がスレッド化されている場合、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のスレッド化をオフにする必要があります。利用可能な任意の手法を使用してスレッド数を設定します (スレッド数を設定する方法を参照)。 |
OpenMP ディレクティブやプラグマを使用してプログラムを並列化し、インテル以外のコンパイラーを使用してプログラムをコンパイルします。 |
複数のスレッド RTL が同時に作業しないように、使用するコンパイラーに一致するインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) のスレッド・ライブラリーにプログラムをリンクします (詳細は、リンクの例を参照)。これが不可能な場合は、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) をシーケンシャル・モードで使用します。この際、適切なスレッド・ライブラリー (mkl_sequential.lib or mkl_sequential.dll) をリンクする必要があります (付録 C: 詳細なディレクトリー構造を参照)。 |
oneTBB のスレッド・テクノロジーを使用してプログラムをスレッド化し、インテル以外のコンパイラーでコンパイルする場合。 |
複数のスレッド RTL が同時に動作しないように、使用するコンパイラーに一致するインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) の oneTBB スレッド・ライブラリーと oneTBB RTL にプログラムをリンクします。これが不可能な場合は、インテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) をシーケンシャル・モードで使用します。この際、適切なスレッド・ライブラリー (mkl_sequential.lib or mkl_sequential_dll.lib) をリンクする必要があります (付録 C: 詳細なディレクトリー構造を参照)。 |
マルチプロセッサー・システムでインテル® oneAPI マス・カーネル・ライブラリー (インテル® oneMKL) を呼び出す複数のプログラムを実行し、メッセージ・パッシング・インターフェイス (MPI) によりプログラムを並列化する場合。 |
実行するさまざまなプログラムのスレッド RTL によって、システム上の同じプロセッサーに多数のスレッドが配置され、マシンのリソースが過剰に使用される可能性があります。その場合、利用可能ないずれかの方法でスレッドの数を 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 |