私はFortranにDGESVD
、MKLを使用し、Intelコンパイラを使用して8コアで実行するコードを持っています。コードはOpenMPを介して高速化されます。omp_num_threads
また、OpenMPとMKLには、スレッド数(および)を設定するための独自の設定があることも知っていmkl_num_threads
ます。最適なスレッド数を知りたい。OMP_NUM_THREADS=1
LAPACKルーチンを呼び出す前に設定する必要がありますか?OpenMPスレッドの数はMKLスレッド数に影響しますか?
1 に答える
MKLは、マルチスレッドドライバーにもOpenMPを使用します。これは、OpenMPスレッドの数がMKLスレッドの数に影響を与えることを意味しますが、非常に複雑な方法です。
まず、OpenMPコードであるため、MKLは、スレッドの数を設定する通常のOpenMPの方法によっても制御されます。たとえばOMP_NUM_THREADS
、への呼び出しなどomp_set_num_threads
です。MKL_NUM_THREADS
ただし、およびの形式でオーバーライド構成メカニズムも提供しますmkl_set_num_threads()
。これにより、ユーザーコードとMKLルーチンで異なる数のスレッドを使用できます。
必要な数のスレッドを構成したら、ネストされた並列処理の場合にMKLがどのように動作するかも知っておく必要があります。つまり、MKLはparallel
、ユーザーコードのアクティブ領域内から呼び出された場合、デフォルトでシングルスレッドで実行されます。MKLは、MKL_DYNAMIC
この動作をオーバーライドできるスイッチを提供しますが、異なるOpenMPランタイム間の互換性は保証されないため、ユーザーコードにはMKLと同じOpenMPコンパイラーを使用する必要があります(Intelのコンパイラーを使用する必要があります)。
一般的に、MKLを呼び出す前にスレッド数を1に設定する必要はありません。これは、MKLスレッドの数を明示的に構成してオーバーライドしない限り、シングルスレッドになるためです。parallel
また、ネストされた並列処理が有効になっている場合、リージョン内から呼び出す場合は注意が必要です。
MKLのスレッド数の制御について詳しくは、MKLのユーザーガイドを参照してください。
- 追加のスレッド制御の使用(それ以外の場合はデッドリンクのミラー)
- スレッド数を設定するテクニック