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 

 
OuvrirSommaireCUDALibrairiesCUDPP

CUDA Data Parallel Primitives.

Cette API, écrite en C, est orientée vers les algorithmes de traitement des données parallèles : réduction, tri... Ces algorithmes sont primitifs : pas forcément triviaux à bien implémenter, mais toujours utiles dans tous les domaine (de la compression des données au traitement numérique de ces données).

CUDPP est prévue pour être surtout très optimisée, en facilitant un maximum les opérations. Le passage du CPU au GPU se fait presque sans douleur.

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

Lien : Site officiel

Tout algorithme de CUDPP doit être préalablement configuré, grâce à une structure de type CUDPPConfiguration. Cette structure est ainsi définie.

Définition de CUDPPConfiguration
Sélectionnez
struct CUDPPConfiguration
{
    CUDPPAlgorithm algorithm;
    CUDPPOperator  op;
    CUDPPDatatype  datatype;
    unsigned int   options;
};

Premièrement, nous utilisons une variable de type CUDPPAlgorithm pour configurer un algorithme. Il s'agit, justement, de l'algorithme à employer.

  • CUDPP_SCAN
  • CUDPP_SEGMENTED_SCAN
  • CUDPP_COMPACT
  • CUDPP_REDUCE
  • CUDPP_SORT_RADIX
  • CUDPP_SORT_RADIX_GLOBAL
  • CUDPP_SPMVMULT
  • CUDPP_SORT_INVALID

Évidemment, cet algorithme devra correspondre à la fonction appelée plus tard avec cette configuration.

Deuxièmement, vous pouvez spécifier un opérateur, l'opération qui sera effectuée, uniquement lors d'un scan. Pour les autres algorithmes, laissez ceci vide.

Tous ces opérateurs sont binairement associables.

  • CUDPP_ADD
  • CUDPP_MULTIPLY
  • CUDPP_MIN
  • CUDPP_MAX

Troisièmement, vous devez définir le type des données en entrée et en sortie. Voici un tableau récapitulatif de ces valeurs, avec leur équivalent en C.

CUDPPDatatype C
CUDPP_CHAR char
CUDPP_UCHAR unsigned char
CUDPP_INT int
CUDPP_UINT unsigned int
CUDPP_FLOAT float

Finalement, la configuration d'un algorithme se fait, finalement, aussi grâce à un entier. Cet entier est constitué d'une combinaison de paramètres, grâce à l'opérateur pipe (|).

Nom Action Valeur
CUDPP_OPTION_FORWARD L'algorithme se déroulera du début vers la fin des données. 0x1
CUDPP_OPTION_BACKWARD L'algorithme se déroulera de la fin vers le début des données. 0x2
CUDPP_OPTION_EXCLUSIVE L'algorithme inclura tous les éléments précédents sauf l'actuel (uniquement pour des scans). 0x4
CUDPP_OPTION_INCLUSIVE L'algorithme inclura tous les éléments précédents et l'actuel (uniquement pour des scans). 0x8
CUDPP_OPTION_CTA_LOCAL L'algorithme sera effectué sans communication entre les blocs (ne fonctionne que pour les tris, pour le moment). 0x10
Créé le 3 août 2009  par Thibaut Cuvelier

cudppPlan() crée un plan planHandler, qui respectera la configuration config, qui traitera n éléments répartis en rows colonnes de rowPitch éléments chacune.

Le plan sera détruit par la fonction cudppDesroyPlan() dès qu'il ne sera plus utilisé.

 
Sélectionnez
CUDPPResult cudppPlan(CUDPPHandle        * planHandle, 
                      CUDPPConfiguration config, 
                      size_t             n, 
                      size_t             rows, 
                      size_t             rowPitch);
                      
CUDPPResult cudppDestroyPlan(CUDPPHandle plan);
Créé le 3 août 2009  par Thibaut Cuvelier

Lien : Configurer un algorithme CUDPP

CUDPP propose plusieurs fonctions pour effectuer des scans. Les voici.

 
Sélectionnez
CUDPPResult cudppScan(CUDPPHandle   planHandle,
                      void        * d_out, 
                      const void  * d_in, 
                      size_t        numElements);

Les données à traiter se situent sur le GPU, à l'emplacement pointé par d_in ; la sortie se situe aussi sur le GPU, à l'emplacement pointé par d_out. La fonction utilisera les options prévues dans le plan planHandle, et scannera numElements éléments.

 
Sélectionnez
CUDPPResult cudppSegmentedScan(CUDPPHandle          planHandle,
                               void               * d_out, 
                               const void         * d_idata,
                               const unsigned int * d_iflags,
                               size_t               numElements);

La fonction traitera les segments précisés dans d_iflags de d_idata.

 
Sélectionnez
CUDPPResult cudppMultiScan(CUDPPHandle planHandle,
                           void        *d_out, 
                           const void  *d_in, 
                           size_t      numElements,
                           size_t      numRows);

La fonction effectuera numRows scans sur les données avant d'écrire le résultat.

 
Sélectionnez
CUDPPResult cudppCompact(CUDPPHandle          planHandle,
                         void               * d_out, 
                         size_t             * d_numValidElements,
                         const void         * d_in, 
                         const unsigned int * d_isValid,
                         size_t               numElements);

Cette fonction compacte un tableau, avec les éléments d_isValid définis comme valides, les autres étant à éjecter. d_numValidElements sera le nombre d'éléments effectivement gardés.

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

Lien : Configurer un algorithme CUDPP
Lien : Créer un plan CUDPP

Il n'existe, pour le moment, qu'une seule fonction de tri de tableau.

 
Sélectionnez
CUDPPResult cudppSort(CUDPPHandle planHandle,
                      void        *d_out, 
                      const void  *d_in,
                      size_t      numElements);

d_out est un pointeur vers le tableau, quand il sera trié. d_in, vers le tableau à trier. Ces tableaux contiendront numElements.

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

Lien : Configurer un algorithme CUDPP
Lien : Créer un plan CUDPP

Chaque fonction de CUDPP renvoie un CUDPPResult, qui peut prendre quelques valeurs, en fonction de l'erreur qui s'est déroulée.

Code Signification
CUDPP_SUCCESS Pas d'erreur.
CUDPP_ERROR_INVALID_HANDLE CUDPPHandle spécifié invalide.
CUDPP_ERROR_ILLEGAL_CONFIGURATION La configuration demandée est impossible (illogique ou invalide).
CUDPP_ERROR_UNKNOWN Erreur inconnue ou impossible à tracer.
Créé le 3 août 2009  par Thibaut Cuvelier

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.