~~NOTOC~~
====== clEnqueueWriteBuffer ======
Fügt ein Kommando zum Schreiben auf ein Buffer-Objekt vom Host-Speicher in die Command Queue ein.
===== Signatur =====
cl_int clEnqueueWriteBuffer ( cl_command_queue command_queue,
cl_mem buffer,
cl_bool blocking_write,
size_t offset,
size_t size,
const void *ptr,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event)
===== Parameter =====
**command_queue:** eine gültige Host-Command-Queue in die der Schreibbefehl eingefügt werden soll. //command_queue// und //buffer// müssen im selben OpenCL-Kontext erzeugt worden sein.
**buffer:** Referenziert ein gültiges Buffer-Objekt.
**blocking_wirte:** zeigt an, ob die Schreiboperation blockieren oder nicht blockieren soll. Falls auf CL_TRUE gestellt: die OpenCL-Implementation kopiert die Daten, auf die von //ptr// gezeigt wird und fügt die Schreiboperation in die CommandQueue. Der Speicher, auf den //ptr// zeigt kann nachdem //clEnqueueWriteBuffer// zurückgekehrt ist wieder benutzt werden. CL_FALSE: Die Implementation wird sofort zurückkehren, der Speicherbereich kann nicht sofort wiederverwendet werden. //event// gibt einen Identifier zurück, mithilfe dessen auf die Beendigung des Schreibbefehls gewartet werden kann, erst danach kann der Speicher wieder benutzt werden.
**offset:** Der Offset in Bytes (also indirekte Adressierung) wohin ins Buffer-Objekt geschrieben wird.
**size:** Die Größe der Daten, die geschrieben werden soll in Bytes.
**ptr:** Pointer auf den Speicherblock im Host-Speicher von dem die Daten geschrieben werden sollen.
**event_wait_list, num_events_in_wait_list:** geben eine Liste der Kommandos an, die fertig gestellt sein müssen, bevor der Schreibbefehl ausgeführt wird. Wenn //event_wait_list// NULL ist, dann wird auf nichts gewartet. //num_events_in_wait_list// muss dann ebenfalls 0 sein. Die Events, die in der Warteliste angegeben sind, agieren als eine Art Synchronisationspunkt. Der OpenCL-Kontext der Events in der Warteliste und die Command Queue müssen die selben sein. Der Speicher von //event_wait_list// kann nach dem die Funktion zurückgekehrt ist wieder benutzt werden.
**event:** gibt ein Event zurück, was diese Schreiboperation eindeutig identifiziert. Dieser Wert kann benutzt werden um den Befehl abzufragen oder einen Wartebefehl für diesen Befehl in die Command Queue einzufügen. //event// kann NULL sein, dann ist es nicht möglich den Status des Befehls abzufragen oder auf den Befehl zu warten. Wenn //event// und //event_wait_list// nicht NULL sind, dann sollte //event// nicht auf ein Element in der //event_wait_list// zeigen.
===== Hinweise =====
Wenn //clEnqueueWriteBuffer// dazu eingesetzt wird, die neusten Bits eines Teils des Puffers zu aktualisieren (mit //ptr//=//host_ptr// + //offset//; //host_ptr// ist dabei der Zeiger auf die Speicherregion, die benutzt wurde als das Bufferobjekt mit CL_MEM_USE_HOST_PTR erzeugt wurde) dann müssen folgende Voraussetzungen erfüllt sein, damit kein undefiniertes Verhalten auftritt:
* Der Speicherbereich des Hosts, der durch (//host_ptr// + //offset//, //size//) gegeben wurde enthält die neusten Bits, wenn das eingereihte Schreibkommando startet
* Das Bufferobjekt oder Speicherobjekt, was von diesem Speicherbereich erzeugt wurde, ist nicht gemappt
* Das Bufferobjekt oder Speicherobjekt, was von diesem Speicherbereich erzeugt wurde, wird nicht von irgendeiner Command Queue benutzt bis das Lese-Kommando vollständig ausgeführt wurde.
===== Rückgabewert =====
Zurückgegeben wird einer der Fehlercodes:
^ Wert ^ Beschreibung ^
| CL_SUCCESS | Der Schreibbefehl wurde erfolgreich in die Command Queue eingefügt. |
| CL_INVALID_COMMAND_QUEUE | //command_queue// ist keine gültige Command Queue |
| CL_INVALID_CONTEXT | //command_queue// und //buffer// oder //command_queue// und die Events in //event_wait_list// wurden nicht im gleichen Kontext erzeugt. |
| CL_INVALID_MEM_OBJECT | //buffer// ist kein gültiges Buffer-Objekt |
| CL_NVALID_VALUE | Der Speicherbereich, der durch (//offset//, //size//) gegeben ist, befindet sich außerhalb der Speichergrenzen oder //ptr// ist NULL oder //size// ist 0 |
| CL_INVALID_EVENT_WAIT_LIST | //event_wait_list// ist NULL und //num_events_in_wait_list// ist größer als 0 oder //event_wait_list// ist nicht NULL aber //num_events_in_wait_list// ist 0 oder wenn Event-Objekte in //event_wait_list// keine gültigen Objekte sind. |
| CL_MISALIGNED_SUB_BUFFER_OFFSET | //buffer// ist ein Sub-Buffer-Objekt und //offset//, der benutzt wurde um das Sub-Buffer-Objekt zu erzeugen, wurde nicht an CL_DEVICE_MEM_BASE_ADDR_ALIGN des Gerätes ausgerichtet |
| CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST | Wenn die Lese- und Schreiboperationen blockieren und der Ausführungsstatus von einem Event in der //event_wait_list// ist ein negativer Integer-Wert |
| CL_MEM_OBJECT_ALLOCATION_FAILURE | Es ist ein Fehler beim Reservieren des Speichers für das Datenspeichern aufgetreten. |
| CL_INVALID_OPERATION | //clEnqueueWriteBuffer// wird auf einen //buffer// angewendet, der mit CL_MEM_HOST_READ_ONLY oder CL_MEM_HOST_NO_ACCESS erzeugt wurde |
| 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. |
===== Beispiel =====
#define LIST_SIZE 12
// command_queue = clCreateCommandQueue (...)
// a_mem_obj = clCreateBuffer(...)
int *A=(int*) malloc(LIST_SIZE*sizeof(int));
for (int i=0; i
===== Siehe auch =====
* [[opencl:reference:clcreatebuffer|clCreateBuffer]]
* [[opencl:reference:clcreatecommandqueue|clCreateCommandQueue]]