很抱歉,这篇文章很长,但我想首先包含我认为相关的所有内容。
我想要的是
我正在为密集矩阵实现 Krylov 子空间方法的并行版本。主要是GMRES、QMR和CG。我意识到(在分析之后)我的 DGEMV 例程是可悲的。所以我决定通过隔离它来集中精力。我曾尝试在 12 核机器上运行它,但以下结果适用于 4 核 Intel i3 笔记本电脑。趋势上没有太大区别。
我的KMP_AFFINITY=VERBOSE
输出在这里可用。
我写了一个小代码:
size_N = 15000
A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad
b = randomly_generated_dense_vector(size_N);
for it=1:n_times %n_times I kept at 50
x = Matrix_Vector_Multi(A,b);
end
我相信这模拟了 CG 50 次迭代的行为。
我试过的:
翻译
我最初是用 Fortran 编写代码的。我将它翻译成 C、MATLAB 和 Python (Numpy)。不用说,MATLAB 和 Python 太可怕了。令人惊讶的是,对于上述值,C 比 FORTRAN 好一两秒。始终如一。
剖析
我分析了要运行的代码,它运行了46.075
几秒钟。这是MKL_DYNAMIC 设置为FALSE
并使用所有内核的时候。如果我将 MKL_DYNAMIC 用作 true,那么在任何给定时间点,只有(大约)一半的内核在使用。以下是一些细节:
Address Line Assembly CPU Time
0x5cb51c mulpd %xmm9, %xmm14 36.591s
最耗时的过程似乎是:
Call Stack LAX16_N4_Loop_M16gas_1
CPU Time by Utilization 157.926s
CPU Time:Total by Utilization 94.1%
Overhead Time 0us
Overhead Time:Total 0.0%
Module libmkl_mc3.so
这里有几张图片:
结论:
我是一个真正的分析初学者,但我意识到速度仍然不好。顺序(1 个核心)代码在53 秒内完成。那是不到 1.1 的加速!
真正的问题:我应该怎么做才能提高我的加速?
我认为可能有帮助但我不能确定的东西:
- Pthreads 实现
- MPI (ScaLapack) 实现
- 手动调优(我不知道怎么做。如果你建议这个,请推荐一个资源)
如果有人需要更多(尤其是关于内存)的详细信息,请告诉我应该运行什么以及如何运行。我以前从未记忆过。