Arbeit mit OpenCL

Programme auf OpenCLsind entwickelt, um Berechnungen auf Grafikkarten mit Unterstützung für OpenCL 1.1 oder höher auszuführen. Moderne Grafikkarten enthalten hunderte von kleinen, spezialisierten Prozessoren, die gleichzeitig einfache mathematische Operationen auf eingehenden Datenströme ausführen können. Die Sprache OpenCL übernimmt die Organisation der Parallel-Computing und ermöglicht eine hohe Geschwindigkeit für eine bestimmte Klasse von Aufgaben.

Bei einigen Grafikkarten ist der Modus der Arbeit mit double-Zahlen deaktiviert, das zum Kompilierung-Fehler 5105 führen kann. Um Unterstützung von double-Zahlen zu aktivieren, fügen Sie eine Direktive #pragma OPENCL EXTENSION cl_khr_fp64 : enable in den Text des OpenCL-Programms hinzu. Aber wenn die Grafikkarte den double-Typ nicht unterstützt, die Einbeziehung dieser Direktive wird nicht helfen.

Es ist zu empfehlen, den OpenCL-Code in separaten CL-Dateien zu schreiben, die man später mithilfe von Ressourcenvariablen einem MQL5-Programm hinzufügen kann.

Behandlung von Fehlern in OpenCL-Programmen

Um Informationen über den letzten Fehler in einem OpenCL-Programm zu erhalten, verwenden Sie die Funktionen CLGetInfoInteger und CLGetInfoString, die es ermöglichen, den Fehlercode und die Textbeschreibung zu erhalten.

Der letzte Fehler von: Um den letzten OpenCL-Fehler zu erhalten, rufen Sie CLGetInfoInteger auf, wobei der Parameter handle ignoriert wird (kann auf Null gesetzt werden). Fehlerbeschreibung: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

Bei einem unbekannten Fehlercode wird die Zeichenkette "unbekannter OpenCL-Fehler N" zurückgegeben, wobei N der Fehlercode ist. Beispiel:

//--- der erste Parameter „handle“ wird ignoriert, wenn man den letzten Fehlercode abruft
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

Textbeschreibung des OpenCL-Fehlers: Um den letzten OpenCL-Fehler zu erhalten, rufen Sie CLGetInfoString auf. Der Fehlercode sollte über den Parameter handle übergeben werden.

Fehlerbeschreibung: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Wenn CL_LAST_ERROR anstelle des Fehlercodes übergeben wird, dann gibt die Funktion die Beschreibung des letzten Fehlers zurück. Zum Beispiel:

//--- liefert den Code des letzten OpenCL-Fehlers
int   code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
string desc; // um eine Fehlertextbeschreibung zu erhalten
 
//--- Verwenden des Fehlercodes, um die Fehlertextbeschreibung zu erhalten
if (!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
 desc = "Die Fehlerbeschreibung von OpenCL konnte nicht angerufen werden," + (string) GetLastError();
Print(desc);
 
//--- um die Beschreibung des letzten OpenCL-Fehlers zu erhalten, ohne zuerst den Code zu erhalten, übergeben Sie CL_LAST_ERROR  
if (!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
 desc = "Die Fehlerbeschreibung von OpenCL konnte nicht angerufen werden," + (string) GetLastError();
Print(desc);

Bislang wird der Name der internen Enumeration als Fehlerbeschreibung angegeben. Ihre Dekodierung finden Sie hier: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Der Wert CL_INVALID_KERNEL_ARGS bedeutet zum Beispiel "Wird beim Enqueuing eines Kernels zurückgegeben, wenn einige Kernel-Argumente nicht gesetzt oder ungültig sind."

Funktionen zum Ausführen von Programmen auf OpenCL:

Funktion

Aktion

CLHandleType

Gibt den Typ des OpenCL-Handles als ein Wert aus Enumeration ENUM_OPENCL_HANDLE_TYPE zurück

CLGetInfoInteger

Gibt den Wer des ganzzahligen Eigenschafts für ein OpenCL-Objekt oder Gerät zurück

CLContextCreate

Erstellt einen Kontext für OpenCL

CLContextFree

Löscht den Kontext von OpenCL

CLGetDeviceInfo

Erhielt die Geräteeigenschaft aus dem OpenCL-Treiber

CLProgramCreate

Erstellt ein OpenCL-Programm aus dem Quellcode

CLProgramFree

Löscht das OpenCL-Programm

CLKernelCreate

Erstellt eine Funktion des Starts von OpenCL

CLKernelFree

Löscht die Funktion des Starts von OpenCL

CLSetKernelArg

Setzt den Parameter für die OpenCL-Funktion

CLSetKernelArgMem

Setzt einen OpenCL-Puffer als ein Parameter der OpenCL-Funktion

CLSetKernelArgMemLocal

Setzt den lokalen Puffer als Argument der kernel-Funktion

CLBufferCreate

Erstellt einen OpenCL-Puffer

CLBufferFree

Löscht einen OpenCL-Puffer

CLBufferWrite

Schreibt ein Array in einen OpenCL-Puffer

CLBufferRead

Liest einen OpenCL-Puffer in ein Array

CLExecute

Führt das OpenCL-Programm aus

CLExecutionStatus

Gibt den Ausführungsstatus eines OpenCL Programms zurück

Sehen Sie auch

OpenCL, Ressourcen