Travailler avec OpenCL

Les programmes OpenCL qui sont utilisés pour effectuer des calculs sur les cartes vidéo prenant en charge OpenCL 1.1 ou supérieur. Les cartes vidéo modernes contiennent des centaines de petits processeurs spécialisés qui peuvent effectuer simultanément des opérations mathématiques simples avec des flux de données entrants. Le langage OpenCL prend en charge l'organisation de tels calculs parallèles et offre une plus grande vitesse pour une certaine classe de tâches.

Dans certaines cartes graphiques, travailler avec des données de type double est désactivé par défaut. Cela peut conduire à des erreurs de compilation 5105. Pour activer le support pour les données de type double, veuillez ajouter la directive suivante à votre programme OpenCL : #pragma OPENCL EXTENSION cl_khr_fp64 : enable. Toutefois, si la carte graphique ne prend pas en charge les doubles, l'activation de cette directive ne sera d'aucun effet.

Il est recommandé d'écrire le code source OpenCL dans des fichiers CL séparés, pouvant être par la suite inclus dans le programme MQL5 en utilisant des variables de ressource.

Gestion des erreurs dans les programmes OpenCL

Pour obtenir des informations sur la dernière erreur dans un programme OpenCL, utilisez les fonctionsCLGetInfoInteger et CLGetInfoString qui permettent l'obtention du code d'erreur et de la description textuelle.

Dernier code d'erreur OpenCL : Pour obtenir la dernière erreur OpenCL, appelez la fonction CLGetInfoInteger, le paramètre handleest ignoré (peut être égal à 0). Description des erreurs :https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

Pour un code d'erreur inconnu, la chaîne "unknown OpenCL error N" () est retournée, où N est le code d'erreur. Exemple :

//--- le premier paramètre 'handle' est ignoré lorsque l'on récupère le dernier code d'erreur
intcode= (int)CLGetInfoInteger(0,CL_LAST_ERROR);

Description textuelle de l'erreur OpenCL : pour obtenir la dernière erreur OpenCL, appelez la fonction CLGetInfoString. Le code d'erreur doit être passé dans le paramètrehandle.

Description des erreurs : https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Si CL_LAST_ERROR est passé à la place du code d'erreur, la fonction renvoie la description de la dernière erreur. Par exemple :

//--- récupère le code de la dernière erreur OpenCL
int   code= (int)CLGetInfoInteger(0,CL_LAST_ERROR);
stringdesc;// pour récupérer la description textuelle de l'erreur
 
//--- utilise le code d'erreur pour obtenir une description du texte de l'erreur
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
 desc="impossible d'obtenir la description de l'erreur OpenCL, "+ (string)GetLastError();
Print(desc);
 
//--- pour obtenir la description de la dernière erreur OpenCL sans obtenir le code en premier, passez la valeur CL_LAST_ERROR  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
 desc="impossible d'obtenir la description de l'erreur OpenCL, "+ (string)GetLastError();
Print(desc);;

Pour l'instant, le nom dans l'énumération interne est donné comme description de l'erreur. Vous pouvez trouver sa description ici :https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Par exemple, la valeur CL_INVALID_KERNEL_ARGS signifie "Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid" ("Renvoyé lors de la mise en file d'attente d'un noyau lorsque certains arguments du noyau n'ont pas été définis ou sont invalides.")

Fonctions pour l'exécution des programmes en OpenCL :

Fonction

Action

CLHandleType

Retourne le type du handle OpenCL comme une valeur de l'énumération ENUM_OPENCL_HANDLE_TYPE

CLGetInfoInteger

Retourne la valeur d'une propriété de type integer pour un objet ou un dispositif OpenCL

CLContextCreate

Crée un contexte OpenCL

CLContextFree

Supprime un contexte OpenCL

CLGetDeviceInfo

Reçoit la propriété du dispositif du pilote informatique OpenCL

CLProgramCreate

Crée un programme OpenCL à partir du code source

CLProgramFree

Supprime un programme OpenCL

CLKernelCreate

Crée une fonction de démarrage OpenCL

CLKernelFree

Supprime une fonction au démarrage de l'OpenCL

CLSetKernelArg

Définit un paramètre pour la fonction OpenCL

CLSetKernelArgMem

Définit un buffer OpenCL en tant que paramètre de la fonction OpenCL

CLSetKernelArgMemLocal

Définit le buffer local comme un argument de la fonction du noyau

CLBufferCreate

Crée un buffer OpenCL

CLBufferFree

Supprime un buffer OpenCL

CLBufferWrite

Ecrit un tableau dans un buffer OpenCL

CLBufferRead

Lit un buffer OpenCL dans un tableau

CLExecute

Exécute un programme OpenCL

CLExecute

Retourne le statut d'exécution du programme OpenCL

Voir aussi

OpenCL, Ressources