[Beignet] [Patch V2] Fix an event status bug.

Zhigang Gong zhigang.gong at linux.intel.com
Thu Jun 19 01:26:58 PDT 2014


LGTM, pushed, thanks.

On Thu, Jun 19, 2014 at 10:37:42PM +0800, Yang Rong wrote:
> If event status is an Error code, the status of events wait on this event also should set to Error code.
> 
> V2: should not execute the enqueue command wait on the event whose status is error.
> Signed-off-by: Yang Rong <rong.r.yang at intel.com>
> ---
>  src/cl_driver.h         | 12 ++++++++----
>  src/cl_driver_defs.c    |  1 +
>  src/cl_event.c          | 18 ++++++++++++++----
>  src/intel/intel_gpgpu.c |  9 +++++++++
>  4 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/src/cl_driver.h b/src/cl_driver.h
> index d935235..2999eb7 100644
> --- a/src/cl_driver.h
> +++ b/src/cl_driver.h
> @@ -193,19 +193,23 @@ extern cl_gpgpu_flush_cb *cl_gpgpu_flush;
>  typedef cl_gpgpu_event (cl_gpgpu_event_new_cb)(cl_gpgpu);
>  extern cl_gpgpu_event_new_cb *cl_gpgpu_event_new;
>  
> -/* new a event for a batch buffer */
> +/* update the batch buffer of this event */
>  typedef int (cl_gpgpu_event_update_status_cb)(cl_gpgpu_event, int);
>  extern cl_gpgpu_event_update_status_cb *cl_gpgpu_event_update_status;
>  
> -/* new a event for a batch buffer */
> +/* pending flush the batch buffer of this event */
>  typedef void (cl_gpgpu_event_pending_cb)(cl_gpgpu, cl_gpgpu_event);
>  extern cl_gpgpu_event_pending_cb *cl_gpgpu_event_pending;
>  
> -/* new a event for a batch buffer */
> +/* flush the batch buffer of this event */
>  typedef void (cl_gpgpu_event_resume_cb)(cl_gpgpu_event);
>  extern cl_gpgpu_event_resume_cb *cl_gpgpu_event_resume;
>  
> -/* new a event for a batch buffer */
> +/* cancel exec batch buffer of this event */
> +typedef void (cl_gpgpu_event_cancel_cb)(cl_gpgpu_event);
> +extern cl_gpgpu_event_cancel_cb *cl_gpgpu_event_cancel;
> +
> +/* delete a gpgpu event */
>  typedef void (cl_gpgpu_event_delete_cb)(cl_gpgpu_event);
>  extern cl_gpgpu_event_delete_cb *cl_gpgpu_event_delete;
>  
> diff --git a/src/cl_driver_defs.c b/src/cl_driver_defs.c
> index 3a9b9ed..c9385c4 100644
> --- a/src/cl_driver_defs.c
> +++ b/src/cl_driver_defs.c
> @@ -81,6 +81,7 @@ LOCAL cl_gpgpu_event_new_cb *cl_gpgpu_event_new = NULL;
>  LOCAL cl_gpgpu_event_update_status_cb *cl_gpgpu_event_update_status = NULL;
>  LOCAL cl_gpgpu_event_pending_cb *cl_gpgpu_event_pending = NULL;
>  LOCAL cl_gpgpu_event_resume_cb *cl_gpgpu_event_resume = NULL;
> +LOCAL cl_gpgpu_event_cancel_cb *cl_gpgpu_event_cancel = NULL;
>  LOCAL cl_gpgpu_event_delete_cb *cl_gpgpu_event_delete = NULL;
>  LOCAL cl_gpgpu_event_get_exec_timestamp_cb *cl_gpgpu_event_get_exec_timestamp = NULL;
>  LOCAL cl_gpgpu_event_get_gpu_cur_timestamp_cb *cl_gpgpu_event_get_gpu_cur_timestamp = NULL;
> diff --git a/src/cl_event.c b/src/cl_event.c
> index 76d6760..db69721 100644
> --- a/src/cl_event.c
> +++ b/src/cl_event.c
> @@ -390,9 +390,15 @@ void cl_event_set_status(cl_event event, cl_int status)
>  
>    if(status <= CL_COMPLETE) {
>      if(event->enqueue_cb) {
> -      cl_enqueue_handle(event, &event->enqueue_cb->data);
> -      if(event->gpgpu_event)
> -        cl_gpgpu_event_update_status(event->gpgpu_event, 1);  //now set complet, need refine
> +      if(status == CL_COMPLETE) {
> +        cl_enqueue_handle(event, &event->enqueue_cb->data);
> +        if(event->gpgpu_event)
> +          cl_gpgpu_event_update_status(event->gpgpu_event, 1);  //now set complet, need refine
> +      } else {
> +        if(event->gpgpu_event)
> +          cl_gpgpu_event_cancel(event->gpgpu_event);  //Error cancel the enqueue
> +      }
> +
>        event->status = status;  //Change the event status after enqueue and befor unlock
>  
>        pthread_mutex_unlock(&event->ctx->event_lock);
> @@ -453,7 +459,11 @@ 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);
> +    /* TODO: if this event wait on several events, one event's
> +       status is error, the others is complete, what's the status
> +       of this event? Can't find the description in OpenCL spec.
> +       Simply update to latest finish wait event.*/
> +    cl_event_set_status(cb->event, status);
>      if(evt->emplict == CL_FALSE) {
>        cl_event_delete(evt);
>      }
> diff --git a/src/intel/intel_gpgpu.c b/src/intel/intel_gpgpu.c
> index 6af6e40..7a95b41 100644
> --- a/src/intel/intel_gpgpu.c
> +++ b/src/intel/intel_gpgpu.c
> @@ -1177,6 +1177,14 @@ intel_gpgpu_event_resume(intel_event_t *event)
>  }
>  
>  static void
> +intel_gpgpu_event_cancel(intel_event_t *event)
> +{
> +  assert(event->batch);           //This command have pending.
> +  intel_batchbuffer_delete(event->batch);
> +  event->batch = NULL;
> +}
> +
> +static void
>  intel_gpgpu_event_delete(intel_event_t *event)
>  {
>    assert(event->batch == NULL);   //This command must have been flushed.
> @@ -1362,6 +1370,7 @@ intel_set_gpgpu_callbacks(int device_id)
>    cl_gpgpu_event_update_status = (cl_gpgpu_event_update_status_cb *)intel_gpgpu_event_update_status;
>    cl_gpgpu_event_pending = (cl_gpgpu_event_pending_cb *)intel_gpgpu_event_pending;
>    cl_gpgpu_event_resume = (cl_gpgpu_event_resume_cb *)intel_gpgpu_event_resume;
> +  cl_gpgpu_event_cancel = (cl_gpgpu_event_cancel_cb *)intel_gpgpu_event_cancel;
>    cl_gpgpu_event_delete = (cl_gpgpu_event_delete_cb *)intel_gpgpu_event_delete;
>    cl_gpgpu_event_get_exec_timestamp = (cl_gpgpu_event_get_exec_timestamp_cb *)intel_gpgpu_event_get_exec_timestamp;
>    cl_gpgpu_event_get_gpu_cur_timestamp = (cl_gpgpu_event_get_gpu_cur_timestamp_cb *)intel_gpgpu_event_get_gpu_cur_timestamp;
> -- 
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list