@@ -79,6 +79,11 @@ cdef class SyclKernelInvalidRangeError (Exception):
7979 '''
8080 pass
8181
82+ cdef class SyclQueueCreationError (Exception ):
83+ ''' This exception is raised when a range that has more than three
84+ dimensions or less than one dimension.
85+ '''
86+ pass
8287
8388cdef class SyclContext:
8489
@@ -479,29 +484,55 @@ cdef class SyclQueue:
479484cdef class _SyclRTManager:
480485 ''' Wrapper for the C API's sycl queue manager interface.
481486 '''
482- cdef dict _backend_ty_dict
483- cdef dict _device_ty_dict
487+ cdef dict _backend_str_ty_dict
488+ cdef dict _device_str_ty_dict
489+ cdef dict _backend_enum_ty_dict
490+ cdef dict _device_enum_ty_dict
484491
485492 def __cinit__ (self ):
486493
487- self ._backend_ty_dict = {
488- " opencl" : _backend_type._OPENCL,
489- " level0" : _backend_type._LEVEL_ZERO
494+ self ._backend_str_ty_dict = {
495+ " opencl" : _backend_type._OPENCL,
496+ " level0" : _backend_type._LEVEL_ZERO,
497+ }
498+
499+ self ._device_str_ty_dict = {
500+ " gpu" : _device_type._GPU,
501+ " cpu" : _device_type._CPU,
502+ }
503+
504+ self ._backend_enum_ty_dict = {
505+ backend_type.opencl : _backend_type._OPENCL,
506+ backend_type.level_zero : _backend_type._LEVEL_ZERO,
490507 }
491508
492- self ._device_ty_dict = {
493- " gpu " : _device_type._GPU ,
494- " cpu " : _device_type._CPU ,
509+ self ._device_enum_ty_dict = {
510+ device_type.cpu : _device_type._CPU ,
511+ device_type.gpu : _device_type._GPU ,
495512 }
496513
514+ cdef _raise_queue_creation_error (self , str be, str dev, int devid, fname):
515+ e = SyclQueueCreationError(
516+ " Queue creation failed for :" , be, dev, devid
517+ )
518+ e.fname = fname
519+ e.code = - 1
520+ raise e
521+
522+
497523 def _set_as_current_queue (self , backend_ty , device_ty , device_id ):
498524 cdef DPPLSyclQueueRef queue_ref
499525
500526 try :
501- beTy = self ._backend_ty_dict [backend_ty]
527+ beTy = self ._backend_str_ty_dict [backend_ty]
502528 try :
503- devTy = self ._device_ty_dict [device_ty]
529+ devTy = self ._device_str_ty_dict [device_ty]
504530 queue_ref = DPPLQueueMgr_PushQueue(beTy, devTy, device_id)
531+ if queue_ref is NULL :
532+ self ._raise_queue_creation_error(
533+ backend_ty, device_ty, device_id,
534+ " DPPLQueueMgr_PushQueue"
535+ )
505536 return SyclQueue._create(queue_ref)
506537 except KeyError :
507538 raise UnsupportedDeviceError(" Device can only be gpu or cpu" )
@@ -553,17 +584,52 @@ cdef class _SyclRTManager:
553584 def get_num_queues (self , backend_ty , device_ty ):
554585 cdef size_t num = 0
555586 try :
556- beTy = self ._backend_ty_dict [backend_ty]
587+ beTy = self ._backend_enum_ty_dict [backend_ty]
557588 try :
558- devTy = self ._device_ty_dict [device_ty]
589+ devTy = self ._device_enum_ty_dict [device_ty]
559590 num = DPPLQueueMgr_GetNumQueues(beTy, devTy)
560591 except KeyError :
561- print (" Device can only be gpu or cpu" )
592+ raise UnsupportedDeviceError(
593+ " Device can only be device_type.gpu or device_type.cpu"
594+ )
562595 except KeyError :
563- print (" Backend can only be opencl or level-0" )
596+ raise UnsupportedBackendError(
597+ " Backend can only be backend_type.opencl or "
598+ " backend_type.level_zero"
599+ )
564600
565601 return num
566602
603+ def has_gpu_queues (self , backend_ty = backend_type.opencl):
604+ cdef size_t num = 0
605+ try :
606+ beTy = self ._backend_enum_ty_dict[backend_ty]
607+ num = DPPLQueueMgr_GetNumQueues(beTy, _device_type._GPU)
608+ except KeyError :
609+ raise UnsupportedBackendError(
610+ " Backend can only be backend_type.opencl or "
611+ " backend_type.level_zero"
612+ )
613+ if num:
614+ return True
615+ else :
616+ return False
617+
618+ def has_cpu_queues (self , backend_ty = backend_type.opencl):
619+ cdef size_t num = 0
620+ try :
621+ beTy = self ._backend_enum_ty_dict[backend_ty]
622+ num = DPPLQueueMgr_GetNumQueues(beTy, _device_type._CPU)
623+ except KeyError :
624+ raise UnsupportedBackendError(
625+ " Backend can only be backend_type.opencl or "
626+ " backend_type.level_zero"
627+ )
628+ if num:
629+ return True
630+ else :
631+ return False
632+
567633 def has_sycl_platforms (self ):
568634 cdef size_t num_platforms = DPPLPlatform_GetNumPlatforms()
569635 if num_platforms:
@@ -603,6 +669,8 @@ get_current_device_type = _mgr.get_current_device_type
603669get_num_platforms = _mgr.get_num_platforms
604670get_num_activated_queues = _mgr.get_num_activated_queues
605671get_num_queues = _mgr.get_num_queues
672+ has_cpu_queues = _mgr.has_cpu_queues
673+ has_gpu_queues = _mgr.has_gpu_queues
606674has_sycl_platforms = _mgr.has_sycl_platforms
607675set_default_queue = _mgr.set_default_queue
608676is_in_device_context = _mgr.is_in_device_context
0 commit comments