summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@intel.com>2017-06-11 13:50:36 +0800
committerYang Rong <rong.r.yang@intel.com>2017-08-02 17:16:30 +0800
commit3c97b3ababa8800f8390d26998cd8737978de72b (patch)
treea82b0cc2fee74b90395f6d37a928e535fe44dc40
parent346fbbb9369592caa073b41049135ddb4321b117 (diff)
downloadbeignet-3c97b3ababa8800f8390d26998cd8737978de72b.tar.gz
Implement cl_event_gen for cl_event.
Signed-off-by: Junyan He <junyan.he@intel.com>
-rw-r--r--runtime/gen/cl_event_gen.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/runtime/gen/cl_event_gen.c b/runtime/gen/cl_event_gen.c
new file mode 100644
index 00000000..4d088ae1
--- /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);
+ }
+}