ウィキペディアの例の線形代数サブルーチンを(Fortran)Intel MKLサブルーチンに置き換えることにより、FORTRANに共役勾配法を実装しました。(DGEMV、DAXPY、およびDNRMのみ。a= bはDCOPYよりも高速であり、a = 2 * aはDSCALよりも高速であることがわかります)
答えは正しく、実装に問題はありません。ただし、次のようにコンパイルすると、ifort CG.f90 -mkl
結果は次のようになります。
MKL_SET_DYNAMIC = TRUE; 140秒
MKL_SET_DYNAMIC = FALSE、MKL_SET_NUM_THREADS = 1; 70秒。
MKL_SET_DYNAMIC = FALSE、MKL_SET_NUM_THREADS = 2; 〜100秒。
いくつかのポイント:
- ハイパースレッディングを介して、2つの実際のコアと2つの仮想コアがあります。2コアマシンで16スレッドを実行しようとはしていません。
M16_LAY_GAS16
プロファイリングにより、多くの検索の後にASMに到達したaへの抽象的な参照が生成されましたmultpd
。それ以外に有用なものは何も出てきませんでした(または、どこを見ればよいかわからなかったかもしれません)FWIW、私はVTuneを使用しました。- 問題のサイズは小さくありません。上記の例は、RAMのサイズに比例するマトリックスサイズの場合です(4GBシステムの場合は約13kx 13k)。
KMP_AFFINITY
シリアルの場合は1つのスレッドを1つのプロセッサにマップし、パラレルの場合は2つのスレッドを2つのプロセッサにマップします。
私の質問は:MKL_DYNAMICがスレッド数を1に設定しないのはなぜそれが最適なのですか?同じ作業(より短い時間)が1で行われる場合、必ずしも2つのスレッドを使用する必要はありません。
インテル®MKLで何か問題がありますか、それとも問題がありますか?