~~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]]