[Beignet] [PATCH] Gracefully handle unsupported systems

Mario Kicherer dev at kicherer.org
Wed May 29 02:23:13 PDT 2013


It worked for me when I enabled only my dedicated GPU in my Optimus laptop
and the IvyBridge GPU was not visible. But I agree that signaling an error
to the caller is safer. I'll try to change that later.

Best regards,
Mario

On Wednesday 29 May 2013 12:18:21 Zhigang Gong wrote:
> Hi,
> 
> The first part LGTM, I will push it latter.
> As to the second part, I agree that call exit is not good in a library
> internal, but we can't just remove the exit, otherwise the application may
> get a "valid" context even when it fails to open the device. Would you like
> to refine the second part of this patch? Maybe we need to change the
> prototype of intel_driver_open and handle the error checking more
> gracefully.
> 
> On Tue, May 28, 2013 at 08:25:39PM +0200, Mario Kicherer wrote:
> > Gracefully handle cases with unsupported or unreachable GPUs. A library
> > should not call exit(). Improved error handling in cl_get_device_ids.
> > 
> > Signed-off-by: Mario Kicherer <dev at kicherer.org>
> > ---
> > 
> >  src/cl_device_id.c       | 50
> >  ++++++++++++++++++++++++++++++++----------------
> >  src/intel/intel_driver.c |  3 ---
> >  2 files changed, 34 insertions(+), 19 deletions(-)
> > 
> > diff --git a/src/cl_device_id.c b/src/cl_device_id.c
> > index 136f3b1..50dc9b6 100644
> > --- a/src/cl_device_id.c
> > +++ b/src/cl_device_id.c
> > @@ -105,30 +105,48 @@ cl_get_device_ids(cl_platform_id    platform,
> > 
> >                    cl_device_id *    devices,
> >                    cl_uint *         num_devices)
> >  
> >  {
> > 
> > +  cl_device_id device;
> > +
> > 
> >    /* Check parameter consistency */
> > 
> > -  if (UNLIKELY(num_entries == 0 && devices == NULL && num_devices ==
> > NULL)) -    return CL_SUCCESS;
> > 
> >    if (UNLIKELY(devices == NULL && num_devices == NULL))
> > 
> > -    return CL_INVALID_VALUE;
> > -  if (UNLIKELY(platform != NULL && platform != intel_platform))
> > +    return CL_SUCCESS;
> > +  if (UNLIKELY(platform != intel_platform))
> > 
> >      return CL_INVALID_PLATFORM;
> > 
> > -  if (num_devices && (device_type == CL_DEVICE_TYPE_CPU)) {
> > -    *num_devices = 0;
> > -    return CL_SUCCESS;
> > +  if (UNLIKELY(
> > +      device_type != CL_DEVICE_TYPE_GPU &&
> > +      device_type != CL_DEVICE_TYPE_DEFAULT &&
> > +      device_type != CL_DEVICE_TYPE_ALL
> > +    ))
> > +  {
> > +    if (num_devices)
> > +      *num_devices = 0;
> > +
> > +    if (device_type == CL_DEVICE_TYPE_CPU ||
> > +        device_type == CL_DEVICE_TYPE_ACCELERATOR
> > +       )
> > +       return CL_DEVICE_NOT_FOUND;
> > +    else
> > +       return CL_INVALID_DEVICE_TYPE;
> > 
> >    }
> > 
> > +  if (UNLIKELY(devices && num_entries == 0))
> > +    return CL_INVALID_VALUE;
> > 
> > -  /* Detect our device (reject a non intel one or gen<6) */
> > -  if (devices && UNLIKELY((*devices = cl_get_gt_device()) != NULL)) {
> > +  /* Do we have a usable device? */
> > +  device = cl_get_gt_device();
> > +  if (!device) {
> > 
> >      if (num_devices)
> > 
> > -      *num_devices = 1;
> > -
> > -    (*devices)->extensions = intel_platform->extensions;
> > -    (*devices)->extensions_sz = intel_platform->extensions_sz;
> > -    return CL_SUCCESS;
> > -  }
> > -  else {
> > +      *num_devices = 0;
> > +    if (devices)
> > +      *devices = 0;
> > +    return CL_DEVICE_NOT_FOUND;
> > +  } else {
> > 
> >      if (num_devices)
> >      
> >        *num_devices = 1;
> > 
> > +    if (devices) {
> > +      *devices = device;
> > +      (*devices)->extensions = intel_platform->extensions;
> > +      (*devices)->extensions_sz = intel_platform->extensions_sz;
> > +    }
> > 
> >      return CL_SUCCESS;
> >    
> >    }
> >  
> >  }
> > 
> > diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
> > index ebc4961..01e0a3a 100644
> > --- a/src/intel/intel_driver.c
> > +++ b/src/intel/intel_driver.c
> > @@ -174,7 +174,6 @@ intel_driver_open(intel_driver_t *intel,
> > cl_context_prop props)> 
> >        && props->gl_type != CL_GL_GLX_DISPLAY
> >        && props->gl_type != CL_GL_EGL_DISPLAY) {
> >      
> >      printf("Unsupported gl share type %d.\n", props->gl_type);
> > 
> > -    exit(-1);
> > 
> >    }
> >    
> >    intel->x11_display = XOpenDisplay(NULL);
> > 
> > @@ -203,7 +202,6 @@ intel_driver_open(intel_driver_t *intel,
> > cl_context_prop props)> 
> >    }
> >    if(!intel_driver_is_active(intel)) {
> >    
> >      printf("Device open failed\n");
> > 
> > -    exit(-1);
> > 
> >    }
> >  
> >  #if defined(HAS_GBM) && defined(HAS_EGL)
> > 
> > @@ -211,7 +209,6 @@ intel_driver_open(intel_driver_t *intel,
> > cl_context_prop props)> 
> >      intel->gbm = gbm_create_device(intel->fd);
> >      if (intel->gbm == NULL) {
> >      
> >        printf("GBM device create failed.\n");
> > 
> > -      exit(-1);
> > 
> >      }
> >      cl_gbm_set_image_extension(intel->gbm, (void*)props->egl_display);
> >    
> >    }


More information about the Beignet mailing list