From 3b842adf63a103ecc9b83b16d9c3d31e3cf0dad9 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Tue, 7 Feb 2023 06:53:56 -0600 Subject: [PATCH 1/5] Reordered DPCTL_USM_HOST and DPCTL_USM_SHARED DEVICE Date: Tue, 7 Feb 2023 12:26:09 -0600 Subject: [PATCH 2/5] Removign dpctl.enum_types.usm_type as unsused --- dpctl/enum_types.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/dpctl/enum_types.py b/dpctl/enum_types.py index a1eaaea6ad..4f80f3e506 100644 --- a/dpctl/enum_types.py +++ b/dpctl/enum_types.py @@ -113,14 +113,3 @@ class global_mem_cache_type(Enum): none = auto() read_only = auto() read_write = auto() - - -class usm_type(Enum): - """ - An enumeration of USM allocation types. - """ - - unknown = auto() - device = auto() - shared = auto() - host = auto() From 567d5cbafc0e5a9c76672e9123204639ef322400 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Tue, 7 Feb 2023 12:48:18 -0600 Subject: [PATCH 3/5] Added _Memory.get_usm_type_enum Also static _Memory.get_pointer_type_enum(ptr, DPCTLSyclContextRef) which returns an integer value implied by DPCTL_USM_TYPE struct. Added tests to exercise get_pointer_type_enum. This is going to be useful for numba_dpex work. --- dpctl/memory/_memory.pxd | 4 ++- dpctl/memory/_memory.pyx | 59 ++++++++++++++++++++++++++++++++++-- dpctl/tests/test_sycl_usm.py | 25 +++++++++++---- 3 files changed, 79 insertions(+), 9 deletions(-) diff --git a/dpctl/memory/_memory.pxd b/dpctl/memory/_memory.pxd index 68fd7f4f13..a9e2719a19 100644 --- a/dpctl/memory/_memory.pxd +++ b/dpctl/memory/_memory.pxd @@ -22,7 +22,7 @@ in dpctl.memory._memory.pyx. """ -from .._backend cimport DPCTLSyclQueueRef, DPCTLSyclUSMRef +from .._backend cimport DPCTLSyclQueueRef, DPCTLSyclUSMRef, _usm_type from .._sycl_context cimport SyclContext from .._sycl_device cimport SyclDevice from .._sycl_queue cimport SyclQueue @@ -57,6 +57,8 @@ cdef public api class _Memory [object Py_MemoryObject, type Py_MemoryType]: @staticmethod cdef bytes get_pointer_type(DPCTLSyclUSMRef p, SyclContext ctx) @staticmethod + cdef _usm_type get_pointer_type_enum(DPCTLSyclUSMRef p, SyclContext ctx) + @staticmethod cdef object create_from_usm_pointer_size_qref( DPCTLSyclUSMRef USMRef, Py_ssize_t nbytes, diff --git a/dpctl/memory/_memory.pyx b/dpctl/memory/_memory.pyx index 93d5b507e0..b650dca33c 100644 --- a/dpctl/memory/_memory.pyx +++ b/dpctl/memory/_memory.pyx @@ -376,6 +376,39 @@ cdef class _Memory: "SyclContext or SyclQueue" ) + def get_usm_type_enum(self, syclobj=None): + """ + get_usm_type(syclobj=None) + + Returns the type of USM allocation using Sycl context carried by + `syclobj` keyword argument. Value of None is understood to query + against `self.sycl_context` - the context used to create the + allocation. + """ + cdef const char* kind + cdef SyclContext ctx + cdef SyclQueue q + if syclobj is None: + ctx = self._context + return _Memory.get_pointer_type_enum( + self.memory_ptr, ctx + ) + elif isinstance(syclobj, SyclContext): + ctx = (syclobj) + return _Memory.get_pointer_type_enum( + self.memory_ptr, ctx + ) + elif isinstance(syclobj, SyclQueue): + q = (syclobj) + ctx = q.get_sycl_context() + return _Memory.get_pointer_type_enum( + self.memory_ptr, ctx + ) + raise TypeError( + "syclobj keyword can be either None, or an instance of " + "SyclContext or SyclQueue" + ) + cpdef copy_to_host(self, obj=None): """ Copy content of instance's memory into memory of ``obj``, or allocate @@ -553,13 +586,35 @@ cdef class _Memory: ) if usm_ty == _usm_type._USM_DEVICE: return b'device' - elif usm_ty == _usm_type._USM_HOST: - return b'host' elif usm_ty == _usm_type._USM_SHARED: return b'shared' + elif usm_ty == _usm_type._USM_HOST: + return b'host' else: return b'unknown' + @staticmethod + cdef _usm_type get_pointer_type_enum(DPCTLSyclUSMRef p, SyclContext ctx): + """ + get_pointer_type(p, ctx) + + Gives the SYCL(TM) USM pointer type, using ``sycl::get_pointer_type``, + returning an enum value. + + Args: + p: DPCTLSyclUSMRef + A pointer to test the type of. + ctx: :class:`dpctl.SyclContext` + Python object providing :class:`dpctl.SyclContext` against + which to query for the pointer type. + Returns: + An enum value corresponding to the type of allocation. + """ + cdef _usm_type usm_ty = DPCTLUSM_GetPointerType( + p, ctx.get_context_ref() + ) + return usm_ty + @staticmethod cdef object create_from_usm_pointer_size_qref( DPCTLSyclUSMRef USMRef, Py_ssize_t nbytes, diff --git a/dpctl/tests/test_sycl_usm.py b/dpctl/tests/test_sycl_usm.py index 9c92549c18..9bbfab70ab 100644 --- a/dpctl/tests/test_sycl_usm.py +++ b/dpctl/tests/test_sycl_usm.py @@ -201,7 +201,7 @@ def test_pickling_reconstructor_invalid_type(memory_ctor): mobj = memory_ctor(1024, alignment=64) good_pickle_bytes = pickle.dumps(mobj) - usm_types = expected_usm_type(memory_ctor).encode("utf-8") + usm_types = expected_usm_type_str(memory_ctor).encode("utf-8") i = good_pickle_bytes.rfind(usm_types) bad_pickle_bytes = good_pickle_bytes[:i] + b"u" + good_pickle_bytes[i + 1 :] with pytest.raises(ValueError): @@ -213,7 +213,7 @@ def memory_ctor(request): return request.param -def expected_usm_type(ctor): +def expected_usm_type_str(ctor): mapping = { MemoryUSMShared: "shared", MemoryUSMDevice: "device", @@ -222,6 +222,15 @@ def expected_usm_type(ctor): return mapping.get(ctor, "unknown") +def expected_usm_type_enum(ctor): + mapping = { + MemoryUSMShared: 2, + MemoryUSMDevice: 1, + MemoryUSMHost: 3, + } + return mapping.get(ctor, 0) + + @pytest.mark.skipif( not has_sycl_platforms(), reason="No SYCL devices except the default host device.", @@ -230,7 +239,8 @@ def test_create_with_size_and_alignment_and_queue(memory_ctor): q = dpctl.SyclQueue() m = memory_ctor(1024, alignment=64, queue=q) assert m.nbytes == 1024 - assert m.get_usm_type() == expected_usm_type(memory_ctor) + assert m.get_usm_type() == expected_usm_type_str(memory_ctor) + assert m.get_usm_type_enum() == expected_usm_type_enum(memory_ctor) @pytest.mark.skipif( @@ -241,7 +251,8 @@ def test_create_with_size_and_queue(memory_ctor): q = dpctl.SyclQueue() m = memory_ctor(1024, queue=q) assert m.nbytes == 1024 - assert m.get_usm_type() == expected_usm_type(memory_ctor) + assert m.get_usm_type() == expected_usm_type_str(memory_ctor) + assert m.get_usm_type_enum() == expected_usm_type_enum(memory_ctor) @pytest.mark.skipif( @@ -251,7 +262,8 @@ def test_create_with_size_and_queue(memory_ctor): def test_create_with_size_and_alignment(memory_ctor): m = memory_ctor(1024, alignment=64) assert m.nbytes == 1024 - assert m.get_usm_type() == expected_usm_type(memory_ctor) + assert m.get_usm_type() == expected_usm_type_str(memory_ctor) + assert m.get_usm_type_enum() == expected_usm_type_enum(memory_ctor) @pytest.mark.skipif( @@ -261,7 +273,8 @@ def test_create_with_size_and_alignment(memory_ctor): def test_create_with_only_size(memory_ctor): m = memory_ctor(1024) assert m.nbytes == 1024 - assert m.get_usm_type() == expected_usm_type(memory_ctor) + assert m.get_usm_type() == expected_usm_type_str(memory_ctor) + assert m.get_usm_type_enum() == expected_usm_type_enum(memory_ctor) @pytest.mark.skipif( From 4b472a6fda27bb9406c978f5ee7df53fcfe77ec8 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Tue, 7 Feb 2023 13:34:49 -0600 Subject: [PATCH 4/5] Make tests invoke get_usm_type_enum --- dpctl/tests/test_sycl_usm.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dpctl/tests/test_sycl_usm.py b/dpctl/tests/test_sycl_usm.py index 9bbfab70ab..948027483c 100644 --- a/dpctl/tests/test_sycl_usm.py +++ b/dpctl/tests/test_sycl_usm.py @@ -270,11 +270,13 @@ def test_create_with_size_and_alignment(memory_ctor): not has_sycl_platforms(), reason="No SYCL devices except the default host device.", ) -def test_create_with_only_size(memory_ctor): - m = memory_ctor(1024) +def test_usm_type_execeptions(): + m = MemoryUSMDevice(1024) assert m.nbytes == 1024 - assert m.get_usm_type() == expected_usm_type_str(memory_ctor) - assert m.get_usm_type_enum() == expected_usm_type_enum(memory_ctor) + with pytest.raises(TypeError): + m.get_usm_type(syclobj=Ellipsis) + with pytest.raises(TypeError): + m.get_usm_type_enum(syclobj=list()) @pytest.mark.skipif( From b5b0be0ec842afe83b9641f33a3100e4d2eb3591 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Tue, 7 Feb 2023 14:19:16 -0600 Subject: [PATCH 5/5] Use get_usm_type, get_usm_type_enum with other syclobj values --- dpctl/tests/test_sycl_usm.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dpctl/tests/test_sycl_usm.py b/dpctl/tests/test_sycl_usm.py index 948027483c..0efb6ccf6d 100644 --- a/dpctl/tests/test_sycl_usm.py +++ b/dpctl/tests/test_sycl_usm.py @@ -271,8 +271,15 @@ def test_create_with_size_and_alignment(memory_ctor): reason="No SYCL devices except the default host device.", ) def test_usm_type_execeptions(): - m = MemoryUSMDevice(1024) + ctor = MemoryUSMDevice + m = ctor(1024) assert m.nbytes == 1024 + q = m.sycl_queue + assert m.get_usm_type(syclobj=q) == expected_usm_type_str(ctor) + assert m.get_usm_type_enum(syclobj=q) == expected_usm_type_enum(ctor) + ctx = q.sycl_context + assert m.get_usm_type(syclobj=ctx) == expected_usm_type_str(ctor) + assert m.get_usm_type_enum(syclobj=ctx) == expected_usm_type_enum(ctor) with pytest.raises(TypeError): m.get_usm_type(syclobj=Ellipsis) with pytest.raises(TypeError):