He implementado CG en FORTRAN al vincularlo a Intel MKL.
Cuando hay declaraciones como: ( Consulte Wikipedia )
p=r;
x=x+alpha*p
r=r-alpha*Ap;
o similares en QMR (en una cantidad mucho mayor)
v_tld = r;
y = v_tld;
rho = norm( y );
w_tld = r;
z = w_tld;
xi = norm( z ); (and more)
¿Tiene sentido utilizar implementaciones BLAS Nivel 1 como DAXPY, DCOPY, DSCAL? La motivación para mi pregunta es:
Tengo 2 implementaciones de los algoritmos. Uno en el que solo he vinculado Norms y MatVecs a MKL; copiar, escalar y agregar se realiza mediante las funciones intrínsecas de Fortran y otra donde BLAS realiza todas las subrutinas posibles.
Tenía la idea de que nada puede ser más rápido que BLAS. Pero, resulta que mi código usando las funciones intrínsecas de Fortran corrió 100% más rápido que uno con las subrutinas BLAS Nivel 1 (FWIW, esto no fue un pequeño problema, fue resolver un sistema denso de tamaño 13k x 13k que llenó mis 4 GB de RAM). Estaba ejecutando ambos en 2 hilos (en una máquina de 2 núcleos)
ifort QMR.f90 -mkl
conMKL_DYNAMIC=TRUE
Había hecho una pregunta sobre SO con respecto a la extensión de BLAS, pero a medida que intentaba incluir BLAS Nivel 1 en mi código, mi código se volvía cada vez más lento.
¿Estoy haciendo algo mal o se espera esto?
Además, ¿tiene sentido intentar extender BLAS para hacer operaciones no obvias como y = 2.89*x
por DCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY
?
Lo que también es interesante es DDOT
y DNRM2
mejora el rendimiento. Lo atribuí al hecho de que, dado que realizan multiplicaciones de doble precisión, podría ser útil ponerlas en paralelo.
Pregunta complementaria: ¿ Cuándo decide si una operación BLAS Nivel 1 realmente ayudará al rendimiento?
Agregando: Actualmente, estoy corriendo en una computadora portátil i3 2.13 GHz con 4 GB de RAM y información de proceso Debian de 64 bits aquí . Pero obtengo respuestas similares en una estación de trabajo Intel Xeon 12 core con 24 GB de RAM.