Lavorare con OpenCL

I programmi in OpenCL sono utilizzati per l'esecuzione di calcoli sulle schede video che supportano OpenCL 1.1 o superiore. Schede video moderne contengono centinaia di piccoli processori specializzati che possono contemporaneamente eseguire semplici operazioni matematiche con i flussi di dati in entrata. Il linguaggio OpenCL organizza il calcolo parallelo ed offre una maggiore velocità per una certa classe di tasks.

In alcune schede grafiche il lavoro con i tipi di numeri double è disabilitato di default. Questo può portare ad un errore di compilazione 5105. Per abilitare il supporto per i numeri di tipo double, si prega di aggiungere la seguente direttiva al programma OpenCL: #pragma OPENCL EXTENSION cl_khr_fp64 : enable. Tuttavia, se una scheda grafica non supporta i double, l'abilitazione di questa direttiva non sarà di aiuto.

Si raccomanda di scrivere il codice sorgente per OpenCL in file separati CL, che possono essere successivamente inseriti nel programma MQL5 utilizzando le variabili di risorse.

Gestione degli errori nei programmi OpenCL

Per ottenere informazioni sull'ultimo errore in un programma OpenCL, utilizzare le funzioniCLGetInfoIntegereCLGetInfoStringche permettono di ottenere il codice dell'errore e la descrizione del testo.

OpenCL ultimo codice errore : Per ottenere l'ultimo errore OpenCL, chiamareCLGetInfoInteger, mentre il parametrohandleviene ignorato (può essere impostato a zero). Descrizione degli errori:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

Per un codice errore sconosciuto, viene restituita la stringa "errore OpenCL sconosciuto N" dove N è un codice di errore. Esempio:

//--- il primo parametro 'handle' viene ignorato quando si ottiene l'ultimo codice errore
intcode=(int)CLGetInfoInteger(0,CL_LAST_ERROR);

Descrizione testuale dell'errore OpenCL: Per ottenere l'ultimo errore OpenCL, chiamareCLGetInfoString. Il codice di errore deve essere passato tramite il parametrohandle.

Descrizione degli errori:>https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Se viene passato CL_LAST_ERROR invece del codice di errore, la funzione restituisce la descrizione dell'ultimo errore. Per esempio:

//--- ottenere il codice dell'ultimo errore OpenCL
int   code= (int)CLGetInfoInteger(0,CL_LAST_ERROR);
stringdesc;// per ottenere una descrizione di testo dell'errore
 
//--- usa il codice dell'errore per ottenere una descrizione di testo dell'errore
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
 desc="impossibile ottenere la descrizione dell'errore OpenCL,"+ (string)GetLastError();
Print(desc);
 
//--- per ottenere la descrizione dell'ultimo errore OpenCL senza prima ottenere il codice, passare CL_LAST_ERROR  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
 desc="impossibile ottenere la descrizione dell'errore OpenCL,"+ (string)GetLastError();
Print(desc);;

Finora, il nome dell'enumerazione interna è dato come descrizione di un errore. Potete trovare la sua codifica qui:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Per esempio, il valore CL_INVALID_KERNEL_ARGS significa "Restituito durante l'accodamento di un kernel quando alcuni argomenti del kernel non sono stati impostati o non sono validi."

Funzioni per l'esecuzione di programmi in OpenCL:

Funzione

Azione

CLHandleType

Restituisce il tipo di un handle OpenCL come valore dell'enumerazione ENUM_OPENCL_HANDLE_TYPE

CLGetInfoInteger

Restituisce il valore di una proprietà integer per un oggetto OpenCL o dispositivo

CLContextCreate

Crea un contesto OpenCL

CLContextFree

Rimuove un contesto OpenCL

CLGetDeviceInfo

Riceve la proprietà del dispositivo dal driver di OpenCL

CLProgramCreate

Crea un programma di OpenCL da un codice sorgente

CLProgramFree

Rimuove un programma di OpenCL

CLKernelCreate

Crea una funzione di avvio OpenCL

CLKernelFree

Rimuove una funzione di avvio OpenCL

CLSetKernelArg

Imposta un parametro per la funzione OpenCL

CLSetKernelArgMem

Imposta un buffer OpenCL come parametro della funzione OpenCL

CLSetKernelArgMemLocal

Imposta il buffer locale come argomento della funzione del kernel

CLBufferCreate

Crea un buffer di OpenCL

CLBufferFree

Elimina un buffer OpenCL

CLBufferWrite

Scrive un array in un buffer OpenCL

CLBufferRead

Legge un buffer OpenCL in un array

CLExecute

Esegue un programma OpenCL

CLExecutionStatus

Restituisce lo stato di esecuzione del programma OpenCL

Vedi anche

OpenCL, Risorse