1 - Introduction aux BLAS
Définition de Wikipedia :
Basic Linear Algebra Subprograms (BLAS) is a de facto application programming
interface standard for publishing libraries to perform basic linear algebravector and matrix
multiplication.Les fonctionnalités BLAS sont organisées en 3 catégories :
BLAS-1 : opérations sur les vecteurs.
BLAS-2 : opérations entre vecteurs et matrices.
BLAS-3 : opérations sur les matrices (ex : produit de matrices).
2 - Introduction à la version OpenBLAS des BLAS
3 - Introduction à la version ATLAS des BLAS
Définition disponible sur les pages officielles d'ATLAS : ATLAS
stands for "Automatically Tuned Linear Algebra Software". ATLAS's
purpose is to provide portably optimal linear algebra software. The
current version provides a complete BLAS API (for both C and
Fortran77), and a very small subset of the LAPACK API.
Atlas Home Page
Résumé des fonctionnalités BLAS disponibles dans ATLAS (2 pages pdf) : ici
4 - API des BLAS pour le produit de matrices denses
La
fonctionnalité BLAS pour réaliser un produit de matrices est "gemm" :
Generic Matrix Matrix (product). Elle est disponible en simple, ou
double précision "dgemm". C'est une
fonctionnalité des BLAS-3 (opérations entre matrices).
La routine dgemm réalise en fait le calcul suivant :
C = alpha.A×B + beta.C
Pour réaliser un simple produit de matrices (C= A×B), on appellera dgemm avec : alpha = 1.0, et : beta = 0.0
C = 1.A×B + 0.C
Les matrices peuvent être "rectangulaires" : A est de taille m×k, et B et de taille k×n, et C est donc de taille m×n.
Mais l'API de la routine dgemm d'Atlas propose quelques paramètres de plus :
dgemm(mode de stockage des matrices (en ligne (mode natif en C) ou en colonne), mode d'acces à A, mode d'accès à B,
m, n, k,
alpha, pointeur sur A, lda : taille
d'une ligne de A lors d'un stockage en ligne (nbr de colonnes de A si pas de "padding"),
pointeur sur B, ldb : taille
d'une ligne de B lors d'un stockage en ligne (nbr de colonnes de B si pas de padding),
beta, pointeur sur C, ldc : taille
d'une ligne de C lors d'un stockage en ligne (nbr de colonnes de C si pas de padding))
- Les
matrices peuvent être srockées en ligne (CblasRowMajor) ce qui est le cas
std en C, ou en colonne (CblasColMajor) ce qui est le cas du FORTRAN.
- Les
matrices peuvent être accédées "normalement" ou en réalisant une
transposition à la volée (si elle ne sont pas dans le format de
stockage initialement).
- Le padding consiste à utiliser des
tableaux (matrices) plus grandes que nécessaire (pour diverses
raisons), dans quel cas les paramètres lda et ldb peuvent être plus
grands que le nombre de colonnes.
5 - Exemple d'uOpenOOtilisation des BLAS pour le produit de matrices denses
Adaptation
du code de produit de matrice du BE pour utiliser les BLAS :
il peut se faire
en écrivant simplement une nouvelle version de la
routine SeqLocalProduct. On pourra utiliser B (et non pas TB),
// ------------------------------------------------------------------
#include <openblas/cblas.h> // Utilisation d'OpenBLAS
//#include <atlas/cblas.h> // Utilisation d'ATLAS
...
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,
SIZE, SIZE, SIZE,
1.0, &A[0][0], SIZE,
&B[0][0], SIZE,
0.0, &C[0][0], SIZE);
...
// ------------------------------------------------------------------
Compilation du programme :
elle doit se faire en précisant d'utiliser la bibliothèque BLAS
choisie, et parfois en précisant de l'appeler dans sa version C ::
- gcc .... -lopenblas
- gcc .... -latlas -lcblas