Fortranには、MKLのDGESVD
を使用し、Intelコンパイラで8つのコアで動作するコードがあります。コードはOpenMP経由でアクセラレーションされます。また、OpenMPとMKLにスレッド数(omp_num_threads
とmkl_num_threads
)を設定する独自の設定があることも知っています。私はスレッドの最適な数を知りたい。 LAPACKルーチンを呼び出す前にOMP_NUM_THREADS=1
を設定する必要がありますか? OpenMPスレッドの数はスレッドのMKL数に影響しますか?OpenMPとMKLスレッディング
6
A
答えて
12
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ランタイム間の互換性が保証されていないため、同じOpenMPコンパイラをMKLのユーザーコードに使用する必要があります。
一般に、MKLを呼び出す前にスレッドの数を1に設定する必要はありません.MKLスレッドの数が明示的に設定されていない限り、単一スレッドになります。また、ネストされた並列処理が有効になっているときには、parallel
領域から呼び出すときは注意が必要です。
MKLのスレッド数の制御に関する詳細は、MKL's User Guideを参照してください。
関連する問題
- 1. MKL:スレッディングの効果を確認できません
- 2. MKL `dgesvd`とMKL` LAPACKE_dgesvd`のパフォーマンス?
- 3. gfortranとIntel MKL
- 4. インテルMKLと行の乗算
- 5. マルチスレッドMKL cblas_sgemmとG ++エラー
- 6. ラズベリーパイ、チキンとスレッディング
- 7. スレッディングとネットワーキング
- 8. PyGTKとスレッディング
- 9. NSOperationとCoreDataスレッディング
- 10. 'sys.excepthook'とスレッディング
- 11. スレッディングとシングルトン
- 12. スレッディングと条件
- 13. AppDomainとスレッディング
- 14. C#スレッディングとブロッキング
- 15. PyQt5シグナルとスレッディング
- 16. c#ブロッキングコレクションとスレッディング
- 17. JDBCとスレッディング
- 18. urllib2とスレッディング
- 19. キューとスレッディング
- 20. インスタンス変数とスレッディング
- 21. GUIのスレッディングとアップデート
- 22. スレッディングとSOLID原則
- 23. C#スレッディングとWindowsフォーム
- 24. C#のスレッディングとグラフィックスプロット
- 25. Pythonのスレッディングでのスレッディング
- 26. Boost RandomとOpenMP
- 27. OpenMPとMPIハイブリッドプログラム
- 28. OpenMPとCPUアフィニティー
- 29. OpenMpとQt Creator
- 30. XcodeコンパイラとOpenMP