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すべてのテストで。
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のパフォーマンスが向上します
メモリ帯域幅は依然としてマルチプロセスMKLタスクのボトルネックのようです。
32GB * 2メモリを8GB * 12に置き換えることで解決されたメモリ帯域幅は、私のアプリケーションのボトルネックです。
テストベンチマークは次のようになります。