运行许多独立实例时 MKL 性能下降

运行许多独立实例时 MKL 性能下降

我想利用安装了 64GB(2 * 32GB)内存的 2 * Xeon gold 6230 系统中的 40 个物理核心。操作系统是 Ubuntu 18.04。

任务是尽可能多地求解随机矩阵的特征值。对于小矩阵,在我的测试中大约为 300x300,通过增加特征值求解器 worker 的独立实例,性能没有明显损失。例如,十个 worker 求解 1000 个矩阵(总共 1E+4 个矩阵),二十个 worker 各自求解 1000 个矩阵(总共 2E+4 个矩阵),以及四十个 worker 各自求解 1000 个矩阵(总共 4E+4 个矩阵),它们完成所需的实际时间大致相同。

但是当矩阵很大(2000x2000)时,随着增加 worker,MKL 性能会显著下降。 MKL_NUM_THREADS=1在所有测试中。

  • 1 名工人,每人 10 个矩阵:1分15秒完成(CPU 100%)
  • 10 名工人,每人 10 个矩阵:2分23秒完成(CPU 1000%)
  • 20 名工人,每人 10 个矩阵:5分34秒完成(CPU 2000%)

20 名工人的绩效比 10 名工人的绩效差一倍多。

测试在 Mathematica 10、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 个矩阵:1分12秒完成
  • 10 名工人,每人 10 个矩阵:1分56秒完成
  • 20 名工人,每人 10 个矩阵:3 分 01 秒完成
  • 40 名工人,每人 10 个矩阵:6 分 59 秒完成

看来内存带宽仍然是多进程MKL任务的瓶颈。

答案1

通过将 32GB*2 内存替换为 8GB*12 来解决,内存带宽是我应用程序中的瓶颈。

测试基准现在如下:

  • 01 名工人,每人 10 个矩阵:1分13秒完成
  • 10 名工人,每人 10 个矩阵:1分47秒完成
  • 20 名工人,每人 10 个矩阵:2分12秒完成
  • 40 名工人,每人 10 个矩阵:2分49秒完成

相关内容