Étapes de programmation OpenCL : Création d'objets mémoire

  • Objets buffer : Blocs de mémoire contigus - stockage séquentiel accessible via des pointeurs, des formats matriciels, etc.
  • Objets image : Objets mémoire unidimensionnels ou tridimensionnels, accessibles uniquement via les fonctions read_image() ou write_image(). Les objets image peuvent être en lecture seule ou en écriture seule, mais ne peuvent pas être simultanément lisibles et modifiables.

Création d'objets buffer

Pour créer un objet buffer, on utilise la fonction suivante :


cl_mem clGenererBuffer(cl_context contexte,
                      cl_mem_flags drapeaux,
                      size_t taille,
                      void* pointeur_hote,
                      cl_int* code_erreur_retour);

Le paramètre drapeaux spécifie les propriétés de lecture/écriture de l'objet buffer. Le pointeur_hote peut être NULL. S'il n'est pas NULL, il pointe généralement vers un buffer valide de l'hôte ; dans ce cas, après la création de l'objet buffer OpenCL, le contenu du buffer hôte est copié dans le buffer OpenCL.

Transfert de données vers le périphérique

Avant l'exécution des noyaux (kernel), les données d'entrée originales de l'hôte doivent être explicitement transférées vers le périphérique. Après l'exécution du kernel, les résultats doivent être renvoyés de la mémoire du périphérique vers la mémoire de l'hôte. Ces opérations sont principalement réalisées par les fonctions clEnqueue{Read/Write}Buffer/Image. Le transfert de l'hôte vers le périphérique utilise clEnqueueWrite, tandis que le transfert du périphérique vers l'hôte utilise clEnqueueRead.

La commande clEnqueueWrite effectue deux opérations : l'initialisation de l'objet mémoire et le transfert des données de l'hôte vers la mémoire du périphérique. Comme mentionné précédemment, il est également possible d'utiliser un poniteur de buffer hôte directement dans la fonction CreateBuffer pour réaliser une écriture de données implicite.


cl_int clAjouterEcritureBuffer(cl_command_file attente_commandes,
                            cl_mem buffer_cible,
                            cl_mode_bloquant ecriture_bloquante,
                            size_t decalage,
                            size_t taille_octets,
                            const void* source,
                            cl_uint nb_evenements_attente,
                            const cl_event* liste_evenements_attente,
                            cl_event* evenement_retour);

Cette fonction initialise l'objet mémoire OpenCL et écrit les données correspondantes dans la mémoire associée du périphérique. Le paramètre ecriture_bloquante détermine si la fonction retourne seulement après la fin de la copie des données ou immédiatement après le début de la copie (mode bloquant vs non bloquant). Les paramètres d'événements spécifient les événements qui doivent être terminés avant l'exécution de cette fonction (par exemple, l'événement de création de l'objet mémoire OpenCL).

Étiquettes: OpenCL mémoire GPU Programmation parallèle Buffer

Publié le 21 juillet à 20h27