web-dev-qa-db-ja.com

多くの独立したインスタンスを実行すると、MKLのパフォーマンスが低下します

64GB(2 * 32GB)メモリがインストールされた2 * Xeonゴールド6230システムで40個の物理コアを利用したいと思います。オペレーティングシステムはUbuntu18.04です。

タスクは、ランダム行列の固有値をできるだけ多く解くことです。小さな行列の場合、約300x300の私のテストでは、固有値ソルバーワーカーの独立したインスタンスを増やすことで、パフォーマンスが大幅に低下することはありません。たとえば、1000個の行列(合計1E + 4行列)を解く10人の労働者、それぞれ1000個の行列(合計2E + 4)を解く20人の労働者、およびそれぞれ1000個の行列(合計4E + 4行列)を解く40人の労働者は、およそ終了するのと同じリアルタイム。

ただし、マトリックスが大きい場合(2000x2000)、ワーカーを増やすとMKLのパフォーマンスが大幅に低下します。 MKL_NUM_THREADS = 1すべてのテストで。

  • 1ワーカー、各10マトリックス:1m15s終了する(CPU 100%)
  • 10ワーカー、各10マトリックス:2m23s終了(CPU 1000%)
  • 20ワーカー、各10マトリックス:5m34s終了する(CPU 2000%)

20人の労働者は10人の労働者の2倍以上悪いパフォーマンスを得る。

テストはMathematica10、Matlab 2019b、python 3.7、およびeigen3(intel mklへのリンク)で実行されます。メモリ使用量は12%未満です。テストコードは単純です。たとえば、Mathematicaコードは次のようになります。 :

mat=Table[RandomReal[],{2000},{2000}];
ParallelDo[Do[Eigenvalues[mat],{10}],{i,1,1}]//AbsoluteTiming
ParallelDo[Do[Eigenvalues[mat],{10}],{i,1,10}]//AbsoluteTiming
ParallelDo[Do[Eigenvalues[mat],{10}],{i,1,20}]//AbsoluteTiming

Mklのパフォーマンスを改善したり、ハードウェアのボトルネックを特定したりするアイデアはありがたいです。

更新:32GB/CPUを16GB * 2/CPUに交換した後、MKLのパフォーマンスが向上します

  • 01ワーカー、各10マトリックス:1m12s終了
  • 10人のワーカー、それぞれ10個のマトリックス:1m56s終了する
  • 20人の労働者、それぞれ10個のマトリックス:m01s終了する
  • 40人の労働者、それぞれ10個のマトリックス:6m59s終了する

メモリ帯域幅は依然としてマルチプロセスMKLタスクのボトルネックのようです。

1
GQ Zhang

32GB * 2メモリを8GB * 12に置き換えることで解決されたメモリ帯域幅は、私のアプリケーションのボトルネックです。

テストベンチマークは次のようになります。

  • 01ワーカー、各10マトリックス:1m13s終了
  • 10人のワーカー、それぞれ10個のマトリックス:1m47s終了する
  • 20人の労働者、それぞれ10個のマトリックス:2m12s終了する
  • 40人の労働者、それぞれ10個のマトリックス:2m49s終了する
0
GQ Zhang