IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ CUDA

FAQ CUDAConsultez toutes les FAQ

Nombre d'auteurs : 1, nombre de questions : 66, dernière mise à jour : 14 juin 2021 

 
OuvrirSommaireCUDALibrairiesCuBLAS

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.

Créé le 3 août 2009  par Thibaut Cuvelier

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.
Créé le 3 août 2009  par Thibaut Cuvelier

La fonction cublasAlloc() crée un tableau (qui pourra représenter une matrice ou un vecteur). Elle prend ces trois paramètres.

  1. int : nombre de cases du tableau ;
  2. int : taille d'un élément du tableau ;
  3. void * * : pointeur vers la mémoire à allouer.

Voici la manière de l'utiliser.

 
Sélectionnez
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.

  1. int : nombre d'éléments à copier du vecteur hôte ;
  2. int : taille d'un élément de chaque côté ;
  3. const void * : vecteur hôte ;
  4. int : nombre d'espaces entre les valeurs du vecteur hôte ;
  5. void * : vecteur périphérique ;
  6. 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.

  1. int : nombre d'éléments à copier du vecteur périphérique ;
  2. int : taille d'un élément de chaque côté ;
  3. const void * : vecteur périphérique ;
  4. int : nombre d'espaces entre les valeurs du vecteur péripérique ;
  5. void * : vecteur hôte ;
  6. 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.
Créé le 3 août 2009  par Thibaut Cuvelier

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.
Créé le 3 août 2009  par Thibaut Cuvelier

Lien : Gestion des erreurs CuBLAS à l'exécution

Copyright © 2009 Thibaut Cuvelier. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.