[Beignet] [PATCH 50/57] Implement cl_event_gen for cl_event.
junyan.he at inbox.com
junyan.he at inbox.com
Sun Jun 11 05:50:36 UTC 2017
From: Junyan He <junyan.he at intel.com>
Signed-off-by: Junyan He <junyan.he at intel.com>
---
runtime/gen/cl_event_gen.c | 105 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 105 insertions(+)
create mode 100644 runtime/gen/cl_event_gen.c
diff --git a/runtime/gen/cl_event_gen.c b/runtime/gen/cl_event_gen.c
new file mode 100644
index 0000000..4d088ae
--- /dev/null
+++ b/runtime/gen/cl_event_gen.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "cl_gen.h"
+
+struct gen_gpgpu;
+extern void gen_gpgpu_event_get_exec_timestamp(void *gpgpu_ctx, int index, uint64_t *ret_ts);
+extern void gen_gpgpu_event_get_gpu_cur_timestamp(cl_device_id device, intel_driver_t *drv, uint64_t *ret_ts);
+
+LOCAL void
+cl_event_update_timestamp_gen(cl_event event, cl_int status)
+{
+ cl_ulong ts = 0;
+ cl_context_gen ctx_gen = NULL;
+
+ if ((event->exec_data.type == EnqueueCopyBufferRect) ||
+ (event->exec_data.type == EnqueueCopyBuffer) ||
+ (event->exec_data.type == EnqueueCopyImage) ||
+ (event->exec_data.type == EnqueueCopyBufferToImage) ||
+ (event->exec_data.type == EnqueueCopyImageToBuffer) ||
+ (event->exec_data.type == EnqueueNDRangeKernel) ||
+ (event->exec_data.type == EnqueueFillBuffer) ||
+ (event->exec_data.type == EnqueueFillImage)) {
+
+ if (status == CL_QUEUED || status == CL_SUBMITTED) {
+ DEV_PRIVATE_DATA(event->ctx, event->queue->device, ctx_gen);
+ gen_gpgpu_event_get_gpu_cur_timestamp(event->queue->device, ctx_gen->drv, &ts);
+
+ if (ts == CL_EVENT_INVALID_TIMESTAMP)
+ ts++;
+ event->timestamp[CL_QUEUED - status] = ts;
+ return;
+ } else if (status == CL_RUNNING) {
+ assert(event->exec_data.exec_ctx);
+ return; // Wait for the event complete and get run and complete then.
+ } else {
+ assert(event->exec_data.exec_ctx);
+ gen_gpgpu_event_get_exec_timestamp(event->exec_data.exec_ctx, 0, &ts);
+ if (ts == CL_EVENT_INVALID_TIMESTAMP)
+ ts++;
+ event->timestamp[2] = ts;
+ gen_gpgpu_event_get_exec_timestamp(event->exec_data.exec_ctx, 1, &ts);
+ if (ts == CL_EVENT_INVALID_TIMESTAMP)
+ ts++;
+ event->timestamp[3] = ts;
+
+ /* Set the submit time the same as running time if it is later. */
+ if (event->timestamp[1] > event->timestamp[2] ||
+ event->timestamp[2] - event->timestamp[1] > 0x0FFFFFFFFFF /*Overflowed */)
+ event->timestamp[1] = event->timestamp[2];
+
+ return;
+ }
+ } else {
+ DEV_PRIVATE_DATA(event->ctx, event->queue->device, ctx_gen);
+ gen_gpgpu_event_get_gpu_cur_timestamp(event->queue->device, ctx_gen->drv, &ts);
+ if (ts == CL_EVENT_INVALID_TIMESTAMP)
+ ts++;
+ event->timestamp[CL_QUEUED - status] = ts;
+ return;
+ }
+}
+
+LOCAL cl_int
+cl_event_create_gen(cl_device_id device, cl_event event)
+{
+ assert(event);
+ assert(event->queue); // Can not be user event
+
+ return CL_SUCCESS;
+}
+
+LOCAL void
+cl_event_delete_gen(cl_device_id device, cl_event event)
+{
+ if (event->exec_data.type == EnqueueNDRangeKernel ||
+ event->exec_data.type == EnqueueFillImage ||
+ event->exec_data.type == EnqueueCopyImage ||
+ event->exec_data.type == EnqueueCopyImageToBuffer ||
+ event->exec_data.type == EnqueueCopyBufferToImage ||
+ event->exec_data.type == EnqueueCopyBuffer ||
+ event->exec_data.type == EnqueueCopyBufferRect ||
+ event->exec_data.type == EnqueueFillBuffer) {
+ cl_enqueue_nd_range_delete_gen(event);
+ } else if (event->exec_data.type == EnqueueNativeKernel) {
+ cl_enqueue_delete_native_kernel(event);
+ } else if (event->exec_data.type == EnqueueSVMMemFree) {
+ cl_svm_free_delete_func(event);
+ }
+}
--
2.7.4
More information about the Beignet
mailing list