抱歉,很长的帖子,但我想一开始就包括我认为相关的所有内容。
我想要的是
我正在实现用于稠密矩阵的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)实施
- 手动调整(我不知道如何。如果您建议这样做,请推荐资源)
如果有人需要更多(特别是关于内存)的详细信息,请让我知道我应该运行什么以及如何运行。我以前从未进行过内存分析。