From 3ba1b21309e7b12f8a2640212f2644c23736fbb5 Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Thu, 5 Jun 2025 10:43:58 -0700 Subject: [PATCH 1/3] handle unsupported dtype for given device in asarray asarray now treats usm_ndarray the same as numpy arrays when the dtype of the array is not supported by targeted device --- dpctl/tensor/_ctors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dpctl/tensor/_ctors.py b/dpctl/tensor/_ctors.py index afd1ca8a25..89588a5ce2 100644 --- a/dpctl/tensor/_ctors.py +++ b/dpctl/tensor/_ctors.py @@ -111,8 +111,6 @@ def _asarray_from_usm_ndarray( raise TypeError( f"Expected dpctl.tensor.usm_ndarray, got {type(usm_ndary)}" ) - if dtype is None: - dtype = usm_ndary.dtype if usm_type is None: usm_type = usm_ndary.usm_type if sycl_queue is not None: @@ -122,6 +120,8 @@ def _asarray_from_usm_ndarray( copy_q = normalize_queue_device(sycl_queue=sycl_queue, device=exec_q) else: copy_q = usm_ndary.sycl_queue + if dtype is None: + dtype = _map_to_device_dtype(usm_ndary.dtype, copy_q) # Conditions for zero copy: can_zero_copy = copy is not True # dtype is unchanged From 9544e89af4683bdea12304f7c7e56dd702d8b5af Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Thu, 5 Jun 2025 16:08:07 -0700 Subject: [PATCH 2/3] add test for resolution of gh-1046 --- dpctl/tests/test_tensor_asarray.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/dpctl/tests/test_tensor_asarray.py b/dpctl/tests/test_tensor_asarray.py index 20e2ddd704..8f7bc6263b 100644 --- a/dpctl/tests/test_tensor_asarray.py +++ b/dpctl/tests/test_tensor_asarray.py @@ -623,3 +623,33 @@ def test_asarray_support_for_usm_ndarray_protocol(usm_type): assert x.dtype == y3.dtype assert y3.usm_data.reference_obj is None assert dpt.all(x[dpt.newaxis, :] == y3) + + +@pytest.mark.parametrize("dt", [dpt.float16, dpt.float64, dpt.complex128]) +def test_asarray_to_device_with_unsupported_dtype(dt): + aspect = "fp16" if dt == dpt.float16 else "fp64" + try: + d0 = dpctl.select_device_with_aspects(aspect) + except dpctl.SyclDeviceCreationError: + pytest.skip("No device with aspect for test") + d1 = None + try: + d1 = dpctl.select_device_with_aspects("cpu", excluded_aspects=[aspect]) + except dpctl.SyclDeviceCreationError: + pass + try: + d1 = dpctl.select_device_with_aspects("gpu", excluded_aspects=[aspect]) + except dpctl.SyclDeviceCreationError: + pass + try: + d1 = dpctl.select_device_with_aspects( + "accelerator", excluded_aspects=[aspect] + ) + except dpctl.SyclDeviceCreationError: + pass + if d1 is None: + pytest.skip("No device with missing aspect for test") + + x = dpt.ones(10, dtype=dt, device=d0) + y = dpt.asarray(x, device=d1) + assert y.sycl_device == d1 From 676e418908627fdd1dcbc71c633cf1d239196675 Mon Sep 17 00:00:00 2001 From: Nikita Grigorian Date: Thu, 5 Jun 2025 16:29:26 -0700 Subject: [PATCH 3/3] loop over dpctl.get_devices instead of using device aspects in asarray test --- dpctl/tests/test_tensor_asarray.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/dpctl/tests/test_tensor_asarray.py b/dpctl/tests/test_tensor_asarray.py index 8f7bc6263b..ae6afa5287 100644 --- a/dpctl/tests/test_tensor_asarray.py +++ b/dpctl/tests/test_tensor_asarray.py @@ -633,23 +633,17 @@ def test_asarray_to_device_with_unsupported_dtype(dt): except dpctl.SyclDeviceCreationError: pytest.skip("No device with aspect for test") d1 = None - try: - d1 = dpctl.select_device_with_aspects("cpu", excluded_aspects=[aspect]) - except dpctl.SyclDeviceCreationError: - pass - try: - d1 = dpctl.select_device_with_aspects("gpu", excluded_aspects=[aspect]) - except dpctl.SyclDeviceCreationError: - pass - try: - d1 = dpctl.select_device_with_aspects( - "accelerator", excluded_aspects=[aspect] - ) - except dpctl.SyclDeviceCreationError: - pass + for d in dpctl.get_devices(): + if d.default_selector_score < 0: + pass + try: + d1 = dpctl.select_device_with_aspects( + d.device_type.name, excluded_aspects=[aspect] + ) + except dpctl.SyclDeviceCreationError: + pass if d1 is None: pytest.skip("No device with missing aspect for test") - x = dpt.ones(10, dtype=dt, device=d0) y = dpt.asarray(x, device=d1) assert y.sycl_device == d1