2012-12-08 20 views
6

Fortranには、MKLのDGESVDを使用し、Intelコンパイラで8つのコアで動作するコードがあります。コードはOpenMP経由でアクセラレーションされます。また、OpenMPとMKLにスレッド数(omp_num_threadsmkl_num_threads)を設定する独自の設定があることも知っています。私はスレッドの最適な数を知りたい。 LAPACKルーチンを呼び出す前にOMP_NUM_THREADS=1を設定する必要がありますか? OpenMPスレッドの数はスレッドのMKL数に影響しますか?OpenMPとMKLスレッディング

答えて

12

MKLは、マルチスレッドドライバ用にOpenMPも使用しています。つまり、OpenMPスレッドの数はMKLスレッドの数に影響しますが、非常に複雑な方法です。

まず、OpenMPコードであるMKLは、通常のOpenMPの方法で制御され、スレッド数を設定します。 OMP_NUM_THREADSを呼び出し、omp_set_num_threadsを呼び出します。しかし、MKL_NUM_THREADSmkl_set_num_threads()の形式でオーバーライド設定メカニズムも提供します。これにより、ユーザーコードとMKLルーチンに異なる数のスレッドを持つことができます。

目的のスレッド数を設定すると、ネストされた並列処理の場合にMKLがどのように動作するかも知る必要があります。つまり、MKLは、ユーザコード内のアクティブなparallel領域内から呼び出された場合、デフォルトではシングルスレッドを実行します。 MKLはこの動作を無効にすることができるMKL_DYNAMICスイッチを提供していますが、異なるOpenMPランタイム間の互換性が保証されていないため、同じOpenMPコンパイラをMKLのユーザーコードに使用する必要があります。

一般に、MKLを呼び出す前にスレッドの数を1に設定する必要はありません.MKLスレッドの数が明示的に設定されていない限り、単一スレッドになります。また、ネストされた並列処理が有効になっているときには、parallel領域から呼び出すときは注意が必要です。

MKLのスレッド数の制御に関する詳細は、MKL's User Guideを参照してください。