Erzeugt eine CommandQueue für ein bestimmtes Gerät mit bestimmten Eigenschaften.
cl_command_queue clCreateCommandQueue( cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret)
context: ein gültiger OpenCL Kontext.
device: ein Device, was mit dem OpenCL Kontext in Verbindung steht. Entweder eines der Devices, was mit clCreateContext verwendet wurde, oder eines, welches dem Kritierium aus clCreateContextFromType übereinstimmt.
properties: spezifiziert die Eigenschaften der Command Queue. Bitfeld. Nur folgende Eingeschaften sind gültig, ansonsten wird das Argument als ungültig angenommen:
Wert | Beschreibung |
---|---|
CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | gibt an, ob die Kommandos, die in die Command Queue eingefügt werden in der richtigen reihenfolge ausgeführt werden (in-order) oder nicht (out-of-order). Falls gesetzt werden die Kommandos out-of-order ausgeführt, ansonsten in-order. Siehe Hinweise. |
CL_QUEUE_PROFILING_ENABLE | Gibt an ob Profiling aktiviert werden soll. |
errcode_ret: Gibt einen entsprechenden Fehlercode zurück. Falls das Argument NULL sein sollte, wird kein Fehlercode zurückgeliefert.
Fehlermeldungen:
Wert | Beschreibung |
---|---|
CL_SUCCESS | Die Command Queue ist nicht 0 - die Funktion wurde erfolgreich ausgeführt. |
CL_INVALID_CONTEXT | context ist kein gültiger OpenCL-Kontext |
CL_INVALID_DEVICE | device bezeichnet kein gültiges OpenCL-Device oder das Device bezieht sich nicht auf den angegebenen Kontext. |
CL_INVALID_VALUE | die Werte von properties sind ungültig. |
CL_INVALID_QUEUE_PROPERTIES | Werte, die in properties angegeben sind sind gültig, werden aber vom Gerät nicht unterstützt. |
CL_OUT_OF_RESOURCES | Es ist ein Fehler beim Reservieren von Speicher aufgetreten, der für die OpenCL-Implementation auf dem Gerät gebraucht wird. |
CL_OUT_OF_HOST_MEMORY | Es ist ein Fehler beim Reservieren von Speicher aufgetreten, der für die OpenCL-Implementation auf dem Hostprozressor gebraucht wird. |
Identifer für das Command-Queue Objekt
OpenCL-Objekte wie Speicher, Programme und Kernel-Objekte werden mithilfe des OpenCL-Kontextes erstellt. Operationen auf diese Objekte können nur über die Command Queue erfolgen. Mehrere Command Queues pro Gerät sind möglich und dienen dazu nicht zusammenhängende Befehle einzureihen ohne irgendeine Art von Synchronisation. Das sollte nur benutzt werden, wenn die Objekte nicht geteilt werden, wenn sie geteilt werden sollen, dann muss die Applikation eine Synchronisation durchführen.
out-of-order / in-order-Ausführung
Die Befehle werden in der Command Queue eingereiht, mithilfe des Parameters properties kann aber auch eine out-of-order Ausführung stattfinden. Wenn wir mithilfe von clEnqueueNDRangeKernel zwei Kernel A und B erzeugen (nacheinander), dann gehen wir bei in-order-Ausführung davon aus, dass Kernel A erst vollständig ausgeführt wird, bevor B startet. Das wird bei out-of-order Ausführung allerdings nicht mehr garantiert. Wenn wir bei out-of-order sicher stellen wollen, dass B begonnen wird, nachdem A vollständig ausgeführt ist, können wir bei clEnqueueNDRangeKernel für Kernel B in der event_wait_list angeben, dass wir auf A warten wollen.
Des Weiteren können wir clEnqueueMarkerWithWaitList oder clEnqueueBarrierWaitList benutzen um sicherzustellen, dass beim ersten alle in der Waitliste angegebenen Events fertig aufgetreten sind, bevor die nächsten Aktionen begonnen werden, oder beim zweiten, dass alle vorher eingefügten Operationen fertig sind, bevor fortgefahren wird.