![]() |
Licence Creative Commons by-nc-nd
(Paternité, pas d'utilisation commerciale, pas de modification) |
BLAS est une bibliothèque d'algèbre linéaire qui permet de réaliser des opérations élémentaires entre : les scalaires, les vecteurs, les matrices. Diffusée en 1979, cette librairie a, depuis, fait l'objet de nombreuses optimisations par la plupart des constructeurs. De ce fait, BLAS est devenu un standard en calcul haute performance et est utilisée dans de nombreuses librairies de plus haut niveau (LAPACK, ScaLAPACK, ...) . On peut également citer ATLAS qui permet d'obtenir une version optimiser de BLAS sans se soucier de l'architecture de la machine.
Pour faciliter son intégration et son utilisation, les concepteurs ont partitionné la librairie en niveaux :
niveau 1 : opérations sur des vecteurs
niveau 2 : opérations matrice-vecteur
niveau 3 : opérations matrice-matrice
Référence des fonctions disponibles : http://www.netlib.org/blas/blasqr.pdf
Différents types de matrice y sont implémentés: format générale, symétrique, hermitienne, triangulaire, ...
Le stockage des matrices est un stockage de type matrice pleine. On peut néanmoins obtenir une version de BLAS pour des matrices creuses (appelée Sparse BLAS) en utilisant par exemple ACML ou Intel MKL.
#include stdio.h
#include gsl/gsl_cblas.h
int
main (void)
{
int lda = 3;
float A[] = { 0.11, 0.12, 0.13,
0.21, 0.22, 0.23 };
int ldb = 2;
float B[] = { 1011, 1012,
1021, 1022,
1031, 1032 };
int ldc = 2;
float C[] = { 0.00, 0.00,
0.00, 0.00 };
/* Compute C = A B */
/* Prefix : s=real, d=double, c=complex, z=complex*16 */
cblas_sgemm (CblasRowMajor,
CblasNoTrans, CblasNoTrans, 2, 2, 3,
1.0, A, lda, B, ldb, 0.0, C, ldc);
printf ("[ %g, %g\n", C[0], C[1]);
printf (" %g, %g ]\n", C[2], C[3]);
return 0;
}
La compilation s'effectue de la façon suivante :
$ gcc -Wall demo.c -lgslcblas
et les sorties de l'exécution donnent :
$ ./a.out
[ 367.76, 368.12
674.06, 674.72 ]
Exemple d'opération simple avec CBLAS, l'interface langage C de BLAS :
#include stdio.h
#include gsl/gsl_cblas.h
int
main (void)
{
int lda = 3;
float A[] = { 0.11, 0.12, 0.13,
0.21, 0.22, 0.23 };
int ldb = 2;
float B[] = { 1011, 1012,
1021, 1022,
1031, 1032 };
int ldc = 2;
float C[] = { 0.00, 0.00,
0.00, 0.00 };
/* Compute C = A B /
/ Prefix : s=real, d=double, c=complex, z=complex*16 */
cblas_sgemm (CblasRowMajor,
CblasNoTrans, CblasNoTrans, 2, 2, 3,
1.0, A, lda, B, ldb, 0.0, C, ldc);
printf ("[ %g, %g\n", C[0], C[1]);
printf (" %g, %g ]\n", C[2], C[3]);
return 0;
}
La compilation s'effectue de la façon suivante :
$ gcc -Wall demo.c -lgslcblas
et les sorties de l'exécution donnent :
$ ./a.out
[ 367.76, 368.12
674.06, 674.72 ]
BLAS est disponible en langage C (CBLAS) et en Fortran 77.
BLAS a été utilisée au LAAS/CNRS dans le projet BINAUR pour "certifier" les résultats de calcul matriciel en dehors de matlab.
Cette librairie est intégrée dans la plupart des distributions Linux (Debian, Ubuntu, Mandriva,...).
BLAS est portée sur les plates-formes unix suivantes : ALPHA, HPPA, LINUX, SGI64, SUN4, SUN4SOL2, comme sur Mac OS X et windows (via cygwin).
BLAS est intégrée dans de nombreuses bibliothèques et librairies de haut niveau.
LAAS/CNRS et de nombreux laboratoires de recherche.
DOCUMENTATION ET SUITES DE TESTS : http://www.netlib.org/blas/
BLAS est une bibliothèque qui n'évolue pas constamment. La dernière proposition d'amélioration est parue en 2002 avec l'ajout de nouvelles fonctionnalités : http://www.netlib.org/blas/faq.html#3