Guía 7

Anuncio
Guı́a 7
LAPACK
Sistemas Complejos en Máquinas Paralelas
2do cuatrimestre del 2015
En esta guı́a se introducirá la biblioteca LAPACK, ampliamente usada en el ámbito de HPC
(High Performance Computing).
LAPACK
LAPACK (Linear Algebra Package) es una biblioteca de software estándar para álgebra lineal
numérica. Se utiliza para cómputo serial y máquinas con memoria compartida (SMP). Es muy
estable y tiene soporte en una amplia variedad de las plataformas. Provee funciones para resolver
ecuaciones lineales simultáneas, soluciones por cuadrados mı́nimos de sistemas de ecuaciones lineales, problemas de autovalores y problemas de valores singulares. También incluye rutinas para
implementar factorizaciones matriciales como LU, QR, Cholesky y la descomposición de Schur.
LAPACK fue originalmente escrito en FORTRAN 77, pero se mudó a Fortran 90 en la versión 3.2
(2008). Maneja matrices reales y complejas, en simple y doble precisión.
Las subrutinas tienen una convención de nombres que hace a los identificadores cortos pero
de difı́cil lectura. Esto fue necesario debido a que el primer estándar de Fortran sólo soportaba
identificadores de hasta 6 caracteres. El nombre de una subrutina en LAPCK tiene la forma pmmaa,
donde
p es un código de una letra que establece la precisión con la que se trabaja. S y D indican
simple o doble precisión respectivamente. C y Z indican lo mismo pero para artimética con
números complejos.
mm es un código de dos letras que denota el tipo de matriz que espera el algoritmo. Por
ejemplo DI indica que se trabajará con un vector de tamaño N que contiene los elementos
de la diagonal de la matriz. GE indica que se trabajará con un arreglo de NxN.
aaa es un código de una a tres letras que describe el algoritmo que se implementa en la
rutina. Por ejemplo SV indica que se resolverá un sistemas de ecuaciones lineales.
LAPACK usa fuertemente la biblioteca BLAS (Basic Linear Algebra Subprograms), el hecho de
tener una implementación buena de BLAS marca una gran diferencia en cuanto a la perfomance
de LAPACK. En general los proveedores de hardware brindan una implementación de BLAS
optimizada para su plataforma. Alternativamente, se puede descargar ATLAS (Automatically
Tuned Linear Algebra Software), para generar automáticamente una versión de BLAS optimizada
de acuerdo a la plataforma del usuario.
BLAS, a su vez, tiene tres niveles de funciones:
Nivel 1: realiza operaciones de escalares con vectores y de vectores con vectores
Nivel 2: realiza operaciones entre matrices y vectores
Nivel 3: realiza operaciones entre matrices
1
Ejercicios LAPACK
1. Siga los pasos a continuación para ejecutar un código ejemplo hecho en Fortran usando
LAPACK:
a) Instale las bibliotecas BLAS y LAPACK. En Ubuntu:
$ sudo apt-get install liblapack-dev liblapack3 libopenblas-base libopenblas-dev
b) Descargue el ejemplo simple-laplace.f90 de la web de la materia y cópielo en un
directorio de prueba. (*1)
c) Analice el código del programa. La función utilizada es dgesv: http://www.netlib.
org/lapack/explore-html/d8/d72/dgesv_8f.html
d ) Podrá compilar y enlazar el programa a la biblioteca con los siguientes comandos:
$ gfortran -Wall -O2 -c simple-laplace.f90 -o simple-laplace.o
$ gfortran simple-laplace.o -llapack -lblas -o simple-laplace
e) Para ejecutar el programa deberá usar:
$ ./simple-laplace
2. Elija uno de los problemas de las guı́as anteriores en donde se haya resuelto un sistema de
ecuaciones lineales en forma matricial AX = B por el método de Jacobi o Gauss-Seidel.
Mida el tiempo que toma la resolución del programa. Recuerde que puede basarse en el
ejemplo S Hello World Time.c en la web de la materia, para realizar el cálculo de tiempos.
3. Resuelva el programa anterior mediante el uso de LAPACK. Mida el tiempo que toma la
resolución del programa. Puede basarse en el programa test lapack fortran c.c que se
encuentra en la web de la materia para llamar a una rutina de Fortran desde C (*2). Podrá
compilar y enlazar el programa a las bibliotecas con los siguientes comandos:
$ g++ -O2 -c test lapack fortran c.c
$ g++ test lapack fortran c.o -o test lapack fortran c -llapack
-lblas -lgfortran -lm
Para ejecutar el programa deberá usar:
$ ./test lapack fortran c
4. Compare las mediciones de tiempos.
(*1) Puede encontrar más ejemplos en https://source.ggy.bris.ac.uk/wiki/NumMethodsPDEs#
Practice:_Solving_Eliptical_Problems_using_LAPACK
(*2) Puede encontrar una explicación más detallada en http://www.physics.utah.edu/~detar/
phys6720/handouts/lapack.html
2
ScaLAPACK
Las bibliotecas ScaLAPACK (Scalable Linear Algebra PACKage) se basan en la misma filosofı́a
que LAPACK, pero se usan en máquinas paralelas de memoria distribuida. Las rutinas de ScaLAPACK manejan algoritmos que particionan los datos en bloques para minimizar la frecuencia de
los movimientos de datos entre los diferentes niveles de la jerarquı́a de memoria. Los elementos fundamentales para la construcción de ScaLAPACK son PBLAS (una versión de memoria distribuı́da
de los niveles 1, 2 y 3 de BLAS) y también BLACS (Basic Linear Algebra Communication Subprograms). En ScaLAPACK la comunicación entre procesos ocurre dentro ambas bibliotecas. Uno
de los objetivos de diseño de ScaLAPACK fue que sus rutinas se parecieran lo más posible a las
de LAPACK.
Después de estudiar los modos de acceso a los datos, se decidió usar una distribución cı́clica en
bloques para repartir los mismos entre los procesos. Para generar una distribución en bloques puede
usar la siguiente aplicación on-line: http://acts.nersc.gov/scalapack/hands-on/datadist.
html
Una explicación con ejemplo de cómo queda la distribución en bloques se puede ver en: http:
//www.netlib.org/scalapack/slug/node76.html Un ejemplo corto se ve en la figura (1).
Figura 1: Distribución de datos de una matriz
Para usar ScaLAPACK se debe inicializar un descriptor por cada matriz con la que se tenga
que operar. Un detalle de la composición está en la figura 2.
Figura 2: Descriptor utilizado para dar información de una matriz
3
Ejercicios ScaLAPACK
Siga los pasos a continuación para ejecutar un código ejemplo hecho en Fortran usando LAPACK:
1. Descargue las bibliotecas del siguiente link: http://www.netlib.org/scalapack/#_scalapack_
version_2_0_2
2. Descomprima scalapack-2.0.2.tgz
3. Renombre el siguiente archivo SLmake.inc.example:
$ mv ./scalapack-2.0.2/SLmake.inc.example ./scalapack-2.0.2/SLmake.inc
4. Analice el código del programa ./scalapack-2.0.2/EXAMPLE/pcscaex.f. La función utilizada
es PDGESV: http://www.mathkeisan.com/usersguide/man/pdgesv.html
5. Podrá compilar y enlazar el programa a la biblioteca con los siguientes comandos:
$ mpif90 -c -O3 pcscaex.f pdscaexinfo.f
$ mpif90 -O3 -o xcscaex pcscaex.o pdscaexinfo.o ../libscalapack.a -llapack -lblas
6. Para ejecutar el programa deberá usar:
$ mpirun -np 4 ./xcscaex
Información útil:
Para obtener información o implementaciones de métodos numéricos en general se recomienda consultar la siguiente url: http://www.netlib.org.
Para obtener ejemplos de matrices con distintas propiedades se recomienda consultar http:
//math.nist.gov/MatrixMarket/.
Para generar matrices de prueba se recomienda usar consultar http://math.nist.gov/
MatrixMarket/data/misc/xlatmr/matgen.html.
4
Descargar