Turing : la bibliothèque LAPACK

Description

LAPACK est un ensemble de sous-programmes Fortran permettant de résoudre des problèmes d'algèbre linéaire (systèmes denses). LAPACK repose sur les BLAS. LAPACK est le successeur des anciennes bibliothèques LINPACK et EISPACK.

Remarques :

  • Quelques sous-programmes de LAPACK, en mode numérique I4S4D8, sont inclus dans la bibliothèque ESSL.
  • Parmi ceux-ci certains sont parallèles de type SMP (en mémoire partagée). On peut avoir accès à ces sous-programmes LAPACK parallélisés en faisant l'édition de liens avec la bibliothèque ESSL SMP.
  • La bibliothèque LAPACK fait appel à des sous-programmes de ESSL (pas seulement les BLAS) pour des raisons d'optimisation.

LAPACK est écrit en Fortran 77.

Versions installées

  • 3.3.1
  • 3.4.2 (version par défaut)

Utilisation

Édition de liens Mode numérique Nom des sous-programmes Mode d'adressage
$ module load lapack
$ mpixlf90_r call_lapack.f
I4S4 S… / C… 32
I4D8 D… / Z…
  • Appel dans un code Fortran

    $ module load lapack
    $ mpixlc_r call_lapack.f90
  • Appel dans un code C/C++ La bibliothèque LAPACK est écrite en Fortran (elle fait notamment appel à de l'allocation dynamique Fortran). Si elle est appelée dans un code C, il faut utiliser, à l'édition de liens, la commande correspondant au système de compilation Fortran (pour que tous les appels Fortran soient résolus).

    $ module load lapack
    $ mpixlc_r -c call_lapack.c
    $ mpixlf90 call_lapack.o

Exemple

$ cat myprogram.f90
...
      integer, parameter:: n = 1000
      double precision a(n,n), b(n)
      integer ipiv(n), info, lwork
      double precision, allocatable:: work(:)
    ...
      ! Get the optimal size of the WORK array:
      allocate(work(1))
      call DSYSV('U', N, 1, A, n, IPIV, B, n, work, -1, INFO)
      print *, ''info = '', info
      if (info /= 0) stop
      lwork = WORK(1)
      print *, ''lwork = '', lwork
      deallocate(work)
      ! Solve the set of equations:
      allocate(work(lwork))
      call DSYSV('U', N, 1, A, n, IPIV, B, n, WORK, LWORK, INFO)
      print *, ''info = '', info
      if (info /= 0) stop
    ...
$ module load lapack
$ mpixlf90_r myprogram.f90