From d5fdc992e6bbe2fbd94c9c94a00c00e84b74d681 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 10 May 2024 10:19:11 -0500 Subject: [PATCH 1/3] Fixture all_root_devices is to keep only 2 devices from each platform This is done to speed-up test suite execution on multi-GPU system, like Aurora. --- dpctl/tests/test_usm_ndarray_dlpack.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/dpctl/tests/test_usm_ndarray_dlpack.py b/dpctl/tests/test_usm_ndarray_dlpack.py index 05a4931ab6..8c407f8152 100644 --- a/dpctl/tests/test_usm_ndarray_dlpack.py +++ b/dpctl/tests/test_usm_ndarray_dlpack.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import collections import ctypes import pytest @@ -57,7 +58,18 @@ def typestr(request): @pytest.fixture def all_root_devices(): - return dpctl.get_devices() + """ + Caches root devices. For the sake of speed + of test suite execution, keep at most two + devices from each platform + """ + devs = dpctl.get_devices() + devs_per_platform = collections.defaultdict(list) + for dev in devs: + devs_per_platform[dev.sycl_platform].append(dev) + + pruned = map(lambda li: li[:2], devs_per_platform.values()) + return sum(pruned, start=[]) def test_dlpack_device(usm_type, all_root_devices): From 506316dc1d4d8ce2a7703573cf90ed7569d6b48a Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 10 May 2024 10:20:22 -0500 Subject: [PATCH 2/3] Add tests for legacy/versions capsule import-export --- dpctl/tests/test_usm_ndarray_dlpack.py | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/dpctl/tests/test_usm_ndarray_dlpack.py b/dpctl/tests/test_usm_ndarray_dlpack.py index 8c407f8152..1c422cc2c9 100644 --- a/dpctl/tests/test_usm_ndarray_dlpack.py +++ b/dpctl/tests/test_usm_ndarray_dlpack.py @@ -22,6 +22,7 @@ import dpctl import dpctl.tensor as dpt +import dpctl.tensor._dlpack as _dlp device_oneAPI = 14 # DLDeviceType.kDLOneAPI @@ -246,3 +247,53 @@ def test_dlpack_from_subdevice(): ar = dpt.arange(n, dtype=dpt.int32, sycl_queue=q) ar2 = dpt.from_dlpack(ar) assert ar2.sycl_device == sdevs[0] + + +def test_legacy_dlpack_capsule(): + try: + x = dpt.arange(100, dtype="i4") + except dpctl.SyclDeviceCreationError: + pytest.skip("No default device available") + + cap = x.__dlpack__(max_version=(0, 8)) + y = _dlp.from_dlpack_capsule(cap) + del cap + assert x._pointer == y._pointer + + x2 = dpt.reshape(x, (10, 10)).mT + cap = x2.__dlpack__(max_version=(0, 8)) + y = _dlp.from_dlpack_capsule(cap) + del cap + assert x2._pointer == y._pointer + + x3 = x[::-2] + cap = x3.__dlpack__(max_version=(0, 8)) + y = _dlp.from_dlpack_capsule(cap) + assert x3._pointer == y._pointer + del x3, y, x + del cap + + +def test_versioned_dlpack_capsule(): + try: + x = dpt.arange(100, dtype="i4") + except dpctl.SyclDeviceCreationError: + pytest.skip("No default device available") + + cap = x.__dlpack__(max_version=(1, 0)) + y = _dlp.from_dlpack_versioned_capsule(cap) + del cap + assert x._pointer == y._pointer + + x2 = dpt.reshape(x, (10, 10)).mT + cap = x2.__dlpack__(max_version=(1, 0)) + y = _dlp.from_dlpack_versioned_capsule(cap) + del cap + assert x2._pointer == y._pointer + + x3 = x[::-2] + cap = x3.__dlpack__(max_version=(1, 0)) + y = _dlp.from_dlpack_versioned_capsule(cap) + assert x3._pointer == y._pointer + del x3, y, x + del cap From 61805ca507a626d13dd834ea6cf2c559e0bd8c37 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk Date: Fri, 10 May 2024 14:57:50 -0500 Subject: [PATCH 3/3] Expand tests more to improve coverage Use F-contiguous array to both legacy and versioned capsule. Add tests for read-only array and for use of copy=True keyword for __dlpack__ call --- dpctl/tests/test_usm_ndarray_dlpack.py | 42 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/dpctl/tests/test_usm_ndarray_dlpack.py b/dpctl/tests/test_usm_ndarray_dlpack.py index 1c422cc2c9..970bb030da 100644 --- a/dpctl/tests/test_usm_ndarray_dlpack.py +++ b/dpctl/tests/test_usm_ndarray_dlpack.py @@ -229,9 +229,8 @@ def test_dlpack_from_subdevice(): except dpctl.SyclSubDeviceCreationError: sdevs = None try: - sdevs = ( - dev.create_sub_devices(partition=[1, 1]) if sdevs is None else sdevs - ) + if sdevs is None: + sdevs = dev.create_sub_devices(partition=[1, 1]) except dpctl.SyclSubDeviceCreationError: pytest.skip("Default device can not be partitioned") assert isinstance(sdevs, list) and len(sdevs) > 0 @@ -255,19 +254,28 @@ def test_legacy_dlpack_capsule(): except dpctl.SyclDeviceCreationError: pytest.skip("No default device available") - cap = x.__dlpack__(max_version=(0, 8)) + legacy_ver = (0, 8) + + cap = x.__dlpack__(max_version=legacy_ver) y = _dlp.from_dlpack_capsule(cap) del cap assert x._pointer == y._pointer x2 = dpt.reshape(x, (10, 10)).mT - cap = x2.__dlpack__(max_version=(0, 8)) + cap = x2.__dlpack__(max_version=legacy_ver) + y = _dlp.from_dlpack_capsule(cap) + del cap + assert x2._pointer == y._pointer + del x2 + + x2 = dpt.asarray(dpt.reshape(x, (10, 10)), order="F") + cap = x2.__dlpack__(max_version=legacy_ver) y = _dlp.from_dlpack_capsule(cap) del cap assert x2._pointer == y._pointer x3 = x[::-2] - cap = x3.__dlpack__(max_version=(0, 8)) + cap = x3.__dlpack__(max_version=legacy_ver) y = _dlp.from_dlpack_capsule(cap) assert x3._pointer == y._pointer del x3, y, x @@ -280,20 +288,34 @@ def test_versioned_dlpack_capsule(): except dpctl.SyclDeviceCreationError: pytest.skip("No default device available") - cap = x.__dlpack__(max_version=(1, 0)) + max_supported_ver = _dlp.get_build_dlpack_version() + cap = x.__dlpack__(max_version=max_supported_ver) y = _dlp.from_dlpack_versioned_capsule(cap) del cap assert x._pointer == y._pointer - x2 = dpt.reshape(x, (10, 10)).mT - cap = x2.__dlpack__(max_version=(1, 0)) + x2 = dpt.asarray(dpt.reshape(x, (10, 10)), order="F") + cap = x2.__dlpack__(max_version=max_supported_ver) y = _dlp.from_dlpack_versioned_capsule(cap) del cap assert x2._pointer == y._pointer + del x2 x3 = x[::-2] - cap = x3.__dlpack__(max_version=(1, 0)) + cap = x3.__dlpack__(max_version=max_supported_ver) y = _dlp.from_dlpack_versioned_capsule(cap) assert x3._pointer == y._pointer del x3, y, x del cap + + # read-only array + x = dpt.arange(100, dtype="i4") + x.flags["W"] = False + cap = x.__dlpack__(max_version=max_supported_ver) + y = _dlp.from_dlpack_versioned_capsule(cap) + assert x._pointer == y._pointer + + # read-only array, and copy + cap = x.__dlpack__(max_version=max_supported_ver, copy=True) + y = _dlp.from_dlpack_versioned_capsule(cap) + assert x._pointer != y._pointer