我通过将它链接到英特尔 MKL 在 FORTRAN 中实现了 CG。
当有这样的陈述时:(参考维基百科)
p=r;
x=x+alpha*p
r=r-alpha*Ap;
或QMR中的类似(数量更多)
v_tld = r;
y = v_tld;
rho = norm( y );
w_tld = r;
z = w_tld;
xi = norm( z ); (and more)
使用 BLAS 1 级实现(例如 DAXPY、DCOPY、DSCAL)是否有意义? 我提出问题的动机是:
我有 2 个算法的实现。我只将 Norms 和 MatVecs 链接到 MKL 的一个;复制、缩放和添加是由 Fortran 的内在函数完成的,而另一个可能的子程序由 BLAS 执行。
我认为没有什么能比 BLAS 更快。但是,事实证明,我使用 Fortran 内部函数的代码比使用 BLAS 1 级子程序的代码运行速度快 100%(FWIW,这不是一个小问题,它解决了一个 13k x 13k 的密集系统,它填满了我的 4 GB 内存)。我在 2 个线程(在 2 核机器上)上
ifort QMR.f90 -mkl
同时运行MKL_DYNAMIC=TRUE
我曾经问过一个关于 BLAS 扩展的 SO问题,但是当我尝试将 BLAS Level 1 包含到我的代码中时,我的代码变得越来越慢。
我做错了什么还是预期的?
y = 2.89*x
此外,尝试扩展 BLAS 以执行诸如by之类的非显而易见的操作是否有意义DCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY
?
同样有趣的是,DDOT
提高DNRM2
性能。我将其归因于这样一个事实,即由于它们执行双精度乘法,因此将它们并行放置可能会有所帮助。
补充问题:您何时决定 BLAS 1 级操作是否真的有助于提高性能?
添加:目前,我在 i3 2.13 GHz 笔记本电脑上运行,具有 4 GB RAM 和 Debian 64 位Proc 信息。但是,我在配备 24 GB RAM 的 Intel Xeon 12 核工作站上得到了类似的答案。