我想利用安装了 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秒完成