Mineure HPC & Support au Big Data
Cours de 3ème année à Supélec

Utilisation d'une bibliothèque BLAS

Stéphane Vialle

Utilisation d'une bibliothèque BLAS (ex: OpenBLAS ou ATLAS)

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).

Wikipedia BLAS page

BLAS Home Page

2 - Introduction à la version OpenBLAS des BLAS
OpenBLAS Home Page

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))

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 ::