8

私はFortranにDGESVD、MKLを使用し、Intelコンパイラを使用して8コアで実行するコードを持っています。コードはOpenMPを介して高速化されます。omp_num_threadsまた、OpenMPとMKLには、スレッド数(および)を設定するための独自の設定があることも知っていmkl_num_threadsます。最適なスレッド数を知りたい。OMP_NUM_THREADS=1LAPACKルーチンを呼び出す前に設定する必要がありますか?OpenMPスレッドの数はMKLスレッド数に影響しますか?

4

1 に答える 1

16

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のユーザーガイドを参照してください。

于 2012-12-09T11:13:58.933 に答える