Skip to content

Commit e4064fa

Browse files
Merge pull request #574 from IntelPython/coverage-sycl-queue
Coverage sycl queue
2 parents 73dfb5c + c5ed2a7 commit e4064fa

File tree

3 files changed

+116
-25
lines changed

3 files changed

+116
-25
lines changed

dpctl/_sycl_queue.pyx

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -289,18 +289,13 @@ cdef class SyclQueue(_SyclQueue):
289289
status = self._init_queue_default(props)
290290
elif len_args == 1:
291291
arg = args[0]
292-
if type(arg) is unicode:
293-
string = bytes(<unicode>arg, "utf-8")
292+
if type(arg) is str:
293+
string = bytes(<str>arg, "utf-8")
294294
filter_c_str = string
295295
status = self._init_queue_from_filter_string(
296296
filter_c_str, props)
297297
elif type(arg) is _SyclQueue:
298298
status = self._init_queue_from__SyclQueue(<_SyclQueue>arg)
299-
elif isinstance(arg, unicode):
300-
string = bytes(<unicode>unicode(arg), "utf-8")
301-
filter_c_str = string
302-
status = self._init_queue_from_filter_string(
303-
filter_c_str, props)
304299
elif isinstance(arg, SyclDevice):
305300
status = self._init_queue_from_device(<SyclDevice>arg, props)
306301
elif pycapsule.PyCapsule_IsValid(arg, "SyclQueueRef"):
@@ -649,8 +644,12 @@ cdef class SyclQueue(_SyclQueue):
649644
else:
650645
return False
651646

652-
def get_sycl_backend(self):
653-
""" Returns the Sycl backend associated with the queue.
647+
@property
648+
def backend(self):
649+
""" Returns the backend_type enum value for this queue.
650+
651+
Returns:
652+
backend_type: The backend for the queue.
654653
"""
655654
cdef _backend_type BE = DPCTLQueue_GetBackend(self._queue_ref)
656655
if BE == _backend_type._OPENCL:
@@ -690,7 +689,7 @@ cdef class SyclQueue(_SyclQueue):
690689
The address of the ``DPCTLSyclQueueRef`` object used to create this
691690
:class:`dpctl.SyclQueue` cast to a ``size_t``.
692691
"""
693-
return int(<size_t>self._queue_ref)
692+
return <size_t>self._queue_ref
694693

695694
cpdef SyclEvent submit(
696695
self,
@@ -848,8 +847,8 @@ cdef class SyclQueue(_SyclQueue):
848847
else:
849848
raise TypeError("Parameter `mem` should have type _Memory")
850849

851-
if (count <=0 or count > self.nbytes):
852-
count = self.nbytes
850+
if (count <=0 or count > mem.nbytes):
851+
count = mem.nbytes
853852

854853
ERef = DPCTLQueue_Prefetch(self._queue_ref, ptr, count)
855854
if (ERef is NULL):
@@ -868,8 +867,8 @@ cdef class SyclQueue(_SyclQueue):
868867
else:
869868
raise TypeError("Parameter `mem` should have type _Memory")
870869

871-
if (count <=0 or count > self.nbytes):
872-
count = self.nbytes
870+
if (count <=0 or count > mem.nbytes):
871+
count = mem.nbytes
873872

874873
ERef = DPCTLQueue_MemAdvise(self._queue_ref, ptr, count, advice)
875874
if (ERef is NULL):
@@ -964,16 +963,6 @@ cdef class SyclQueue(_SyclQueue):
964963

965964
return SyclEvent._create(ERef, [])
966965

967-
@property
968-
def backend(self):
969-
"""Returns the backend_type enum value for the device
970-
associated with this queue.
971-
972-
Returns:
973-
backend_type: The backend for the device.
974-
"""
975-
return self.sycl_device.backend
976-
977966
@property
978967
def name(self):
979968
"""Returns the device name for the device

dpctl/tests/test_sycl_context.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,26 @@ def test_hashing_of_context():
187187
def test_context_repr():
188188
ctx = dpctl.SyclContext()
189189
assert type(ctx.__repr__()) is str
190+
191+
192+
def test_cpython_api():
193+
import ctypes
194+
import sys
195+
196+
ctx = dpctl.SyclContext()
197+
mod = sys.modules[ctx.__class__.__module__]
198+
# get capsule storign get_context_ref function ptr
199+
ctx_ref_fn_cap = mod.__pyx_capi__["get_context_ref"]
200+
# construct Python callable to invoke "get_context_ref"
201+
cap_ptr_fn = ctypes.pythonapi.PyCapsule_GetPointer
202+
cap_ptr_fn.restype = ctypes.c_void_p
203+
cap_ptr_fn.argtypes = [ctypes.py_object, ctypes.c_char_p]
204+
ctx_ref_fn_ptr = cap_ptr_fn(
205+
ctx_ref_fn_cap, b"DPCTLSyclContextRef (struct PySyclContextObject *)"
206+
)
207+
callable_maker = ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.py_object)
208+
get_context_ref_fn = callable_maker(ctx_ref_fn_ptr)
209+
210+
r2 = ctx.addressof_ref()
211+
r1 = get_context_ref_fn(ctx)
212+
assert r1 == r2

dpctl/tests/test_sycl_queue.py

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,8 @@ def test_queue_submit_barrier(valid_filter):
424424
ev3.wait()
425425
ev1.wait()
426426
ev2.wait()
427+
with pytest.raises(TypeError):
428+
q.submit_barrier(range(3))
427429

428430

429431
def test_queue__repr__():
@@ -433,16 +435,93 @@ def test_queue__repr__():
433435
r2 = q2.__repr__()
434436
q3 = dpctl.SyclQueue(property="enable_profiling")
435437
r3 = q3.__repr__()
436-
q4 = dpctl.SyclQueue(property=["in_order", "enable_profiling"])
438+
q4 = dpctl.SyclQueue(property="default")
437439
r4 = q4.__repr__()
440+
q5 = dpctl.SyclQueue(property=["in_order", "enable_profiling"])
441+
r5 = q5.__repr__()
438442
assert type(r1) is str
439443
assert type(r2) is str
440444
assert type(r3) is str
441445
assert type(r4) is str
446+
assert type(r5) is str
447+
448+
449+
def test_queue_invalid_property():
450+
with pytest.raises(ValueError):
451+
dpctl.SyclQueue(property=4.5)
452+
with pytest.raises(ValueError):
453+
dpctl.SyclQueue(property=["abc", tuple()])
442454

443455

444456
def test_queue_capsule():
445457
q = dpctl.SyclQueue()
446458
cap = q._get_capsule()
459+
cap2 = q._get_capsule()
447460
q2 = dpctl.SyclQueue(cap)
448461
assert q == q2
462+
del cap2 # call deleter on non-renamed capsule
463+
464+
465+
def test_cpython_api():
466+
import ctypes
467+
import sys
468+
469+
q = dpctl.SyclQueue()
470+
mod = sys.modules[q.__class__.__module__]
471+
# get capsule storign get_context_ref function ptr
472+
q_ref_fn_cap = mod.__pyx_capi__["get_queue_ref"]
473+
# construct Python callable to invoke "get_queue_ref"
474+
cap_ptr_fn = ctypes.pythonapi.PyCapsule_GetPointer
475+
cap_ptr_fn.restype = ctypes.c_void_p
476+
cap_ptr_fn.argtypes = [ctypes.py_object, ctypes.c_char_p]
477+
q_ref_fn_ptr = cap_ptr_fn(
478+
q_ref_fn_cap, b"DPCTLSyclQueueRef (struct PySyclQueueObject *)"
479+
)
480+
callable_maker = ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.py_object)
481+
get_queue_ref_fn = callable_maker(q_ref_fn_ptr)
482+
483+
r2 = q.addressof_ref()
484+
r1 = get_queue_ref_fn(q)
485+
assert r1 == r2
486+
487+
488+
def test_constructor_many_arg():
489+
with pytest.raises(TypeError):
490+
dpctl.SyclQueue(None, None, None, None)
491+
with pytest.raises(TypeError):
492+
dpctl.SyclQueue(None, None)
493+
ctx = dpctl.SyclContext()
494+
with pytest.raises(TypeError):
495+
dpctl.SyclQueue(ctx, None)
496+
with pytest.raises(TypeError):
497+
dpctl.SyclQueue(ctx)
498+
499+
500+
def test_queue_wait():
501+
try:
502+
q = dpctl.SyclQueue()
503+
except dpctl.SyclQueueCreationError:
504+
pytest.skip("Failed to create device with supported filter")
505+
q.wait()
506+
507+
508+
def test_queue_memops():
509+
try:
510+
q = dpctl.SyclQueue()
511+
except dpctl.SyclQueueCreationError:
512+
pytest.skip("Failed to create device with supported filter")
513+
from dpctl.memory import MemoryUSMDevice
514+
515+
m1 = MemoryUSMDevice(512, queue=q)
516+
m2 = MemoryUSMDevice(512, queue=q)
517+
q.memcpy(m1, m2, 512)
518+
q.prefetch(m1, 512)
519+
q.mem_advise(m1, 512, 0)
520+
with pytest.raises(TypeError):
521+
q.memcpy(m1, list(), 512)
522+
with pytest.raises(TypeError):
523+
q.memcpy(list(), m2, 512)
524+
with pytest.raises(TypeError):
525+
q.prefetch(list(), 512)
526+
with pytest.raises(TypeError):
527+
q.mem_advise(list(), 512, 0)

0 commit comments

Comments
 (0)