FAQ CUDA
FAQ CUDAConsultez toutes les FAQ
Nombre d'auteurs : 1, nombre de questions : 66, dernière mise à jour : 14 juin 2021
CuBLAS est une implémentation de la bibliothèque BLAS (Basic Linear Algebra Subprograms). À l'origine prévu pour Fortran, elle a été adapté pour le C. Il fait partie d'une librairie plus grande, LAPACK (Linear Algebra Package). Ces deux bibliothèques ont une implémentation de référence, disponible sur netlib
Ces librairies sont souvent réimplémentées par des constructeurs, pour les optimiser au mieux sur leur plateforme. Par exemple, Intel avec sa MKL (Math Kernel Library : LAPACK), ou NVIDIA avec CuBLAS (uniquement BLAS).
BLAS est divisée en trois niveaux. Le premier ne s'occupe que des opérations entre vecteurs. Le second, entre matrices et vecteurs. Le troisième, entre matrices.
CuBLAS est officiellement supportée par NVIDIA.
Lien : netlib
Lien : refblas (implémentation de référence de BLAS)
Lien : reflapack (implémentation de référence de LAPACK)
Lien : Intel MKL
CuBLAS s'initialise très simplement : grâce à la fonction cublasInit(), qui ne prend aucun paramètre. Par contre, des erreurs peuvent arriver : cette fonction les renvoie. Les voici.
- CUBLAS_STATUS_ALLOC_FAILED : erreur à l'allocation des ressources ;
- CUBLAS_STATUS_SUCCESS : succès.
Quand vous n'aurez plus besoin de CuBLAS, pour éviter des problèmes d'accès ultérieurs au GPU, vous devez l'éteindre. Pour ce faire, ce n'est pas plus compliqué que pour l'initialisation : la fonction cublasShutdown() y suffit. Voici les erreurs qu'elle peut émettre.
- CUBLAS_STATUS_NOT_INITIALIZED : les ressources n'ont pas encore été allouées ;
- CUBLAS_STATUS_SUCCESS : succès.
La fonction cublasAlloc() crée un tableau (qui pourra représenter une matrice ou un vecteur). Elle prend ces trois paramètres.
- int : nombre de cases du tableau ;
- int : taille d'un élément du tableau ;
- void * * : pointeur vers la mémoire à allouer.
Voici la manière de l'utiliser.
float
*
periph =
0
;
cublasAlloc
(
500
, sizeof
(
periph[0
]), (
void
*
*
) &
periph);
Le tableau contiendra 500 éléments qui auront la taille d'un flottant. Ce tableau est accessible par le pointeur periph.
Le tableau ainsi créé est vide : il faut donc le remplir. Pour cela, il existe deux fonctions : une pour les vecteurs, une pour les matrices. Ces fonctions ne font que de la copie d'un tableau en local vers le tableau sur le périphérique.
La fonction cublasSetVector permet de copier un vecteur vers le périphérique. Voici ses paramètres.
- int : nombre d'éléments à copier du vecteur hôte ;
- int : taille d'un élément de chaque côté ;
- const void * : vecteur hôte ;
- int : nombre d'espaces entre les valeurs du vecteur hôte ;
- void * : vecteur périphérique ;
- int : nombre d'espaces entre les valeurs du vecteur péripérique.
Ensuite, la fonction cublasGetVector permet de copier un vecteur vers l'hôte. Voici ses paramètres.
- int : nombre d'éléments à copier du vecteur périphérique ;
- int : taille d'un élément de chaque côté ;
- const void * : vecteur périphérique ;
- int : nombre d'espaces entre les valeurs du vecteur péripérique ;
- void * : vecteur hôte ;
- int : nombre d'espaces entre les valeurs du vecteur hôte.
La fonction cublasSetMatrix permet de copier une matrice vers le périphérique. Voici ses paramètres.
- int : nombre de lignes ;
- int : nombre de colonnes ;
- int : taille d'un élément ;
- const void * : matrice hôte ;
- int : dimension majeure de la matrice hôte ;
- void : matrice périphérique ;
- int : dimension majeure de la matrice périphérique.
Ensuite, la fonction cublasGetMatrix permet de copier une matrice vers l'hôte. Voici ses paramètres.
- int : nombre de lignes ;
- int : nombre de colonnes ;
- int : taille d'un élément ;
- const void * : matrice périphérique ;
- int : dimension majeure de la matrice périphérique ;
- void : matrice hôte ;
- int : dimension majeure de la matrice hôte.
Seules les fonctions d'initialisation et d'extinction retournent directement leur code d'erreur : sous CuBLAS, il existe une fonction qui s'occupe de récupérer les erreurs des autres. Cette fonction, c'est cublasGetError(). Voici la liste des codes qu'elle peut récupérer.
Code d'erreur | Signification |
---|---|
CUBLAS_STATUS_SUCCESS | Réussite de l'opération. |
CUBLAS_STATUS_NOT_INITIALIZED | CuBLAS n'a pas été initialisé. |
CUBLAS_STATUS_ALLOC_FAILED | CuBLAS n'a pas pu allouer de la mémoire (pas assez de mémoire, en général). |
CUBLAS_STATUS_INVALID_VALUE | Une variable numérique non supportée a été passée à la fonction. |
CUBLAS_STATUS_ARCH_MISMATCH | Le GPU ne supporte pas les opérations en double précision. |
CUBLAS_STATUS_MAPPING_ERROR | CuBLAS n'a pas pu accéder au GPU. |
CUBLAS_STATUS_EXECUTION_FAILED | CuBLAS n'a pas pu exécuter votre demande correctement sur le GPU. |
CUBLAS_STATUS_INTERNAL_ERROR | Erreur interne. |