BLAS (Basic Linear Algebra Subprograms)
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
- addition de 2 vecteurs,
- produit scalaire,
- calcul de norme,
- ...
niveau 2 : opérations matrice-vecteur
- addition d'un produit matrice-vecteur et d'un vecteur,
- résolution de systèmes matrice-vecteur où la matrice est triangulaire supérieure ou inférieure,
- ...
niveau 3 : opérations matrice-matrice
- addition d'un produit matrice-matrice et d'une matrice,
- résolution de systèmes matrice-matrice où la première matrice est triangulaire supérieure ou inférieure,
- ...
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.
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 ]
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.