[Beignet] [PATCH 3/4] Refine and fix some event bugs.
Yang Rong
rong.r.yang at intel.com
Tue Sep 17 01:10:00 PDT 2013
Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
src/cl_event.c | 40 ++++++++++++++++++++++++++++++++++------
src/cl_event.h | 2 +-
2 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/src/cl_event.c b/src/cl_event.c
index e882c7c..83e1f50 100644
--- a/src/cl_event.c
+++ b/src/cl_event.c
@@ -27,6 +27,23 @@
#include <assert.h>
#include <stdio.h>
+inline cl_bool
+cl_event_is_gpu_command_type(cl_command_type type)
+{
+ switch(type) {
+ case CL_COMMAND_COPY_BUFFER:
+ case CL_COMMAND_COPY_IMAGE:
+ case CL_COMMAND_COPY_IMAGE_TO_BUFFER:
+ case CL_COMMAND_COPY_BUFFER_TO_IMAGE:
+ case CL_COMMAND_COPY_BUFFER_RECT:
+ case CL_COMMAND_TASK:
+ case CL_COMMAND_NDRANGE_KERNEL:
+ return CL_TRUE;
+ default:
+ return CL_FALSE;
+ }
+}
+
cl_event cl_event_new(cl_context ctx, cl_command_queue queue, cl_command_type type, cl_bool emplict)
{
cl_event event = NULL;
@@ -56,7 +73,8 @@ cl_event cl_event_new(cl_context ctx, cl_command_queue queue, cl_command_type ty
}
else {
event->status = CL_QUEUED;
- event->gpgpu_event = cl_gpgpu_event_new(queue->gpgpu);
+ if(cl_event_is_gpu_command_type(event->type))
+ event->gpgpu_event = cl_gpgpu_event_new(queue->gpgpu);
}
cl_event_add_ref(event); //dec when complete
event->user_cb = NULL;
@@ -77,6 +95,8 @@ void cl_event_delete(cl_event event)
if (UNLIKELY(event == NULL))
return;
+ cl_event_update_status(event);
+
if (atomic_dec(&event->ref_n) > 1)
return;
@@ -153,7 +173,7 @@ cl_int cl_event_check_waitlist(cl_uint num_events_in_wait_list,
/* check the event_wait_list and num_events_in_wait_list */
if((event_wait_list == NULL) &&
(num_events_in_wait_list > 0))
- goto exit;
+ goto error;
if ((event_wait_list != NULL) &&
(num_events_in_wait_list == 0)){
@@ -225,7 +245,9 @@ void cl_event_new_enqueue_callback(cl_event event,
/* Allocate and inialize the structure itself */
TRY_ALLOC_NO_ERR (cb, CALLOC(enqueue_callback));
cb->num_events = num_events_in_wait_list;
- cb->wait_list = event_wait_list;
+ TRY_ALLOC_NO_ERR (cb->wait_list, CALLOC_ARRAY(cl_event, num_events_in_wait_list));
+ for(i=0; i<num_events_in_wait_list; i++)
+ cb->wait_list[i] = event_wait_list[i];
cb->event = event;
cb->next = NULL;
cb->wait_user_events = NULL;
@@ -274,8 +296,8 @@ void cl_event_new_enqueue_callback(cl_event event,
}
}
}
- if(data->queue != NULL) {
- assert(event->gpgpu_event);
+
+ if(data->queue != NULL && event->gpgpu_event != NULL) {
cl_gpgpu_event_pending(data->queue->gpgpu, event->gpgpu_event);
data->ptr = (void *)event->gpgpu_event;
}
@@ -291,6 +313,8 @@ error:
cb->wait_user_events = cb->wait_user_events->next;
cl_free(u_ev);
}
+ if(cb->wait_list)
+ cl_free(cb->wait_list);
cl_free(cb);
}
goto exit;
@@ -317,6 +341,8 @@ void cl_event_set_status(cl_event event, cl_int status)
if(status <= CL_COMPLETE) {
if(event->enqueue_cb) {
cl_enqueue_handle(&event->enqueue_cb->data);
+ if(event->gpgpu_event)
+ cl_gpgpu_event_update_status(event->gpgpu_event, 1); //now set complet, need refine
event->status = status; //Change the event status after enqueue and befor unlock
pthread_mutex_unlock(&event->ctx->event_lock);
@@ -324,6 +350,8 @@ void cl_event_set_status(cl_event event, cl_int status)
cl_event_delete(event->enqueue_cb->wait_list[i]);
pthread_mutex_lock(&event->ctx->event_lock);
+ if(event->enqueue_cb->wait_list)
+ cl_free(event->enqueue_cb->wait_list);
cl_free(event->enqueue_cb);
event->enqueue_cb = NULL;
}
@@ -385,7 +413,7 @@ void cl_event_set_status(cl_event event, cl_int status)
/* Call the pending operation */
evt = cb->event;
cl_event_set_status(cb->event, CL_COMPLETE);
- if(cb->event->emplict == CL_FALSE) {
+ if(evt->emplict == CL_FALSE) {
cl_event_delete(evt);
}
}
diff --git a/src/cl_event.h b/src/cl_event.h
index c921cb2..8523abe 100644
--- a/src/cl_event.h
+++ b/src/cl_event.h
@@ -39,7 +39,7 @@ typedef struct _enqueue_callback {
cl_event event; /* The event relative this enqueue callback */
enqueue_data data; /* Hold all enqueue callback's infomation */
cl_uint num_events; /* num events in wait list */
- const cl_event* wait_list; /* All event wait list this callback wait on */
+ cl_event* wait_list; /* All event wait list this callback wait on */
user_event* wait_user_events; /* The head of user event list the callback wait on */
struct _enqueue_callback* next; /* The next enqueue callback in wait list */
} enqueue_callback;
--
1.8.1.2
More information about the Beignet
mailing list