0

ウィキペディアの例の線形代数サブルーチンを(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秒。

いくつかのポイント:

  1. ハイパースレッディングを介して、2つの実際のコアと2つの仮想コアがあります。2コアマシンで16スレッドを実行しようとはしていません。
  2. M16_LAY_GAS16プロファイリングにより、多くの検索の後にASMに到達したaへの抽象的な参照が生成されましたmultpd。それ以外に有用なものは何も出てきませんでした(または、どこを見ればよいかわからなかったかもしれません)FWIW、私はVTuneを使用しました。
  3. 問題のサイズは小さくありません。上記の例は、RAMのサイズに比例するマトリックスサイズの場合です(4GBシステムの場合は約13kx 13k)。
  4. KMP_AFFINITYシリアルの場合は1つのスレッドを1つのプロセッサにマップし、パラレルの場合は2つのスレッドを2つのプロセッサにマップします。

私の質問は:MKL_DYNAMICがスレッド数を1に設定しないのはなぜそれが最適なのですか?同じ作業(より短い時間)が1で行われる場合、必ずしも2つのスレッドを使用する必要はありません。

インテル®MKLで何か問題がありますか、それとも問題がありますか?

4

1 に答える 1

3

MKL_DYNAMIC機能的にはOpenMP標準のOMP_DYNAMIC/と同じです。omp_set_dynamic()

「コードをできるだけ速く実行するために、スレッドの数を魔法のように変更する」という意味ではありません。これは、システムリソースまたはその他の実装固有の理由がある場合、ランタイムが状況によっては、ユーザー指定の値またはシステムのデフォルトからスレッド数を変更できることを意味します。MKL_SET_DYNAMIC = TRUEスレッドの数を指定しておらず、4つの同時ハードウェアスレッドが使用可能であることを考えると、あなたのケースでは4つのスレッドを使用していると思います。

のようなものを実行した場合MKL_SET_DYNAMIC=TRUE MKL_SET_NUM_THREADS=16、ランタイムがスレッドカウントを4に抑制し、パフォーマンスはよりも優れていることに気付くかもしれませMKL_SET_DYNAMIC=FALSE MKL_SET_NUM_THREADS=16ん。これは、ランタイムが、使用可能な同時ハードウェアスレッドの数より多くを要求していることを検出する可能性があるためです。しかし、それが私が期待するすべてです。

于 2012-04-16T05:18:47.677 に答える