Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions dpctl/tests/helper/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
has_cpu,
has_gpu,
has_sycl_platforms,
skip_if_usm_unsupported,
)

__all__ = [
Expand All @@ -30,4 +31,5 @@
"has_gpu",
"has_sycl_platforms",
"get_queue_or_skip",
"skip_if_usm_unsupported",
]
23 changes: 23 additions & 0 deletions dpctl/tests/helper/_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,26 @@ def get_queue_or_skip(args=()):
except dpctl.SyclQueueCreationError:
pytest.skip(f"Queue could not be created from {args}")
return q


def skip_if_usm_unsupported(mem_cls, syclobj=None):
"""Skips the test if the device of ``syclobj`` (a device or a queue,
the default device if ``None``) cannot allocate ``mem_cls`` memory.
"""
import dpctl.memory as dpm

if syclobj is None:
try:
syclobj = dpctl.SyclDevice()
except dpctl.SyclDeviceCreationError:
pytest.skip("No SYCL devices available")
dev = (
syclobj.sycl_device if isinstance(syclobj, dpctl.SyclQueue) else syclobj
)
supported = {
dpm.MemoryUSMShared: dev.has_aspect_usm_shared_allocations,
dpm.MemoryUSMHost: dev.has_aspect_usm_host_allocations,
dpm.MemoryUSMDevice: dev.has_aspect_usm_device_allocations,
}
if not supported[mem_cls]:
pytest.skip(f"{mem_cls.__name__} is not supported on {dev.name}")
4 changes: 3 additions & 1 deletion dpctl/tests/test_sycl_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

import dpctl

from .helper import create_invalid_capsule
from .helper import create_invalid_capsule, skip_if_usm_unsupported

list_of_valid_filter_selectors = [
"opencl",
Expand Down Expand Up @@ -170,7 +170,9 @@ def test_context_multi_device():
q2 = dpctl.SyclQueue(ctx, d2)
import dpctl.memory as dpm

skip_if_usm_unsupported(dpm.MemoryUSMShared, q1)
shmem_1 = dpm.MemoryUSMShared(256, queue=q1)
skip_if_usm_unsupported(dpm.MemoryUSMDevice, q2)
shmem_2 = dpm.MemoryUSMDevice(256, queue=q2)
shmem_2.copy_from_device(shmem_1)
# create context for single sub-device
Expand Down
6 changes: 6 additions & 0 deletions dpctl/tests/test_sycl_ipc_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
SyclIPCOpenMemHandle,
)

from .helper import skip_if_usm_unsupported

pytestmark = pytest.mark.skipif(
not IPCMemoryHandle.is_available(),
reason="IPC memory not supported in this build",
Expand Down Expand Up @@ -68,12 +70,14 @@ def test_get_handle_from_device_memory(self):

def test_get_handle_rejects_shared_memory(self):
q = _get_ipc_queue()
skip_if_usm_unsupported(MemoryUSMShared, q)
mem = MemoryUSMShared(1024, queue=q)
with pytest.raises(TypeError):
SyclIPCGetMemHandle(mem)

def test_get_handle_rejects_host_memory(self):
q = _get_ipc_queue()
skip_if_usm_unsupported(MemoryUSMHost, q)
mem = MemoryUSMHost(1024, queue=q)
with pytest.raises(TypeError):
SyclIPCGetMemHandle(mem)
Expand Down Expand Up @@ -136,11 +140,13 @@ def test_normal_memory_is_not_ipc(self):

def test_shared_memory_is_not_ipc(self):
q = _get_ipc_queue()
skip_if_usm_unsupported(MemoryUSMShared, q)
mem = MemoryUSMShared(1024, queue=q)
assert not isinstance(mem, MemoryIPCDevice)

def test_host_memory_is_not_ipc(self):
q = _get_ipc_queue()
skip_if_usm_unsupported(MemoryUSMHost, q)
mem = MemoryUSMHost(1024, queue=q)
assert not isinstance(mem, MemoryIPCDevice)

Expand Down
19 changes: 14 additions & 5 deletions dpctl/tests/test_sycl_queue_copy.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@
import dpctl
import dpctl.memory

from .helper import skip_if_usm_unsupported


def _create_memory(q):
nbytes = 1024
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mobj = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
return mobj

Expand Down Expand Up @@ -97,9 +100,9 @@ def test_copy_type_error():
@pytest.mark.parametrize(
"usm_type",
[
lambda n, q: dpctl.memory.MemoryUSMShared(n, queue=q),
lambda n, q: dpctl.memory.MemoryUSMHost(n, queue=q),
lambda n, q: dpctl.memory.MemoryUSMDevice(n, queue=q),
dpctl.memory.MemoryUSMShared,
dpctl.memory.MemoryUSMHost,
dpctl.memory.MemoryUSMDevice,
],
ids=["shared", "host", "device"],
)
Expand All @@ -113,8 +116,9 @@ def test_copy_with_dtype_valid(dtype, element_size, usm_type):
num_elements = 16
nbytes = num_elements * element_size

src = usm_type(nbytes, q)
dst = usm_type(nbytes, q)
skip_if_usm_unsupported(usm_type, q)
src = usm_type(nbytes, queue=q)
dst = usm_type(nbytes, queue=q)

# For device memory, use host buffer for init and verification
if isinstance(src, dpctl.memory.MemoryUSMDevice):
Expand Down Expand Up @@ -155,6 +159,7 @@ def test_copy_async_with_dtype_valid():
num_elements = 10
nbytes = num_elements * element_size

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
src = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
dst = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

Expand Down Expand Up @@ -191,6 +196,7 @@ def test_copy_count_is_in_elements(dtype, element_size):
num_elements = 4
nbytes = num_elements * element_size

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
src = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
dst = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

Expand Down Expand Up @@ -220,6 +226,7 @@ def test_copy_with_invalid_dtype():
pytest.skip("Default constructor for SyclQueue failed")

nbytes = 64
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
src = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
dst = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

Expand Down Expand Up @@ -265,6 +272,7 @@ def test_copy_with_dtype_mixed_sources():

# Host to USM
src_host = np.arange(num_elements, dtype=np.int64)
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
dst_usm = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

q.copy(dst_usm, src_host, num_elements, dtype=dtype)
Expand All @@ -284,6 +292,7 @@ def test_copy_without_dtype_backward_compat():
pytest.skip("Default constructor for SyclQueue failed")

nbytes = 32
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
src = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
dst = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

Expand Down
26 changes: 14 additions & 12 deletions dpctl/tests/test_sycl_queue_fill.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import dpctl
import dpctl.memory

from .helper import skip_if_usm_unsupported

# Maps a dtype string to the NumPy dtype used to build the expected result.
_dtype_to_np = {
"i1": np.int8,
Expand Down Expand Up @@ -63,17 +65,6 @@
]


def _skip_if_usm_unsupported(q, mem_cls):
dev = q.sycl_device
supported = {
dpctl.memory.MemoryUSMShared: dev.has_aspect_usm_shared_allocations,
dpctl.memory.MemoryUSMHost: dev.has_aspect_usm_host_allocations,
dpctl.memory.MemoryUSMDevice: dev.has_aspect_usm_device_allocations,
}
if not supported[mem_cls]:
pytest.skip(f"{mem_cls.__name__} is not supported on this device")


def _read_back(mem, nbytes):
"""Return the first ``nbytes`` bytes of a USM allocation as ``bytes``."""
if isinstance(mem, dpctl.memory.MemoryUSMDevice):
Expand All @@ -92,7 +83,7 @@ def test_fill_with_dtype_valid(dtype, mem_cls):
q = dpctl.SyclQueue()
except dpctl.SyclQueueCreationError:
pytest.skip("Default constructor for SyclQueue failed")
_skip_if_usm_unsupported(q, mem_cls)
skip_if_usm_unsupported(mem_cls, q)

np_dt = _dtype_to_np[dtype]
value = _fill_values[dtype]
Expand All @@ -114,6 +105,7 @@ def test_fill_default_dtype_is_bytewise():
pytest.skip("Default constructor for SyclQueue failed")

nbytes = 64
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

q.fill(mem, 0, nbytes)
Expand All @@ -130,6 +122,7 @@ def test_fill_signed_negative_value():
pytest.skip("Default constructor for SyclQueue failed")

num_elements = 8
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(num_elements, queue=q)

q.fill(mem, -1, num_elements, dtype="i1")
Expand All @@ -143,6 +136,7 @@ def test_fill_async():
pytest.skip("Default constructor for SyclQueue failed")

num_elements = 32
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(num_elements, queue=q)

e = q.fill_async(mem, 0xAB, num_elements)
Expand All @@ -162,6 +156,7 @@ def test_fill_async_with_dtype():
num_elements = 10
nbytes = num_elements * 8

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
e = q.fill_async(mem, value, num_elements, dtype="f8")
e.wait()
Expand All @@ -178,6 +173,7 @@ def test_fill_async_with_dep_events():

num_elements = 64
half = num_elements // 2
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(num_elements, queue=q)

e1 = q.fill_async(mem, 0x11, num_elements)
Expand All @@ -194,6 +190,7 @@ def test_fill_async_bad_dep_events():
except dpctl.SyclQueueCreationError:
pytest.skip("Default constructor for SyclQueue failed")

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(16, queue=q)

with pytest.raises(TypeError):
Expand All @@ -211,6 +208,7 @@ def test_fill_complex_from_real_scalar(dtype):
num_elements = 8
nbytes = num_elements * np.dtype(np_dt).itemsize

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
q.fill(mem, 2.0, num_elements, dtype=dtype)

Expand All @@ -236,6 +234,7 @@ def test_fill_count_is_in_elements(dtype, element_size):
num_elements = 8
nbytes = num_elements * element_size

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

# Seed the whole allocation with a known sentinel to verify the untouched
Expand All @@ -261,6 +260,7 @@ def test_fill_with_invalid_dtype():
except dpctl.SyclQueueCreationError:
pytest.skip("Default constructor for SyclQueue failed")

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(64, queue=q)

for bad_dtype in ["i3", "f16", "u16", "x4", "42", "float", ""]:
Expand Down Expand Up @@ -291,6 +291,7 @@ def test_fill_value_out_of_range(dtype, value):
except dpctl.SyclQueueCreationError:
pytest.skip("Default constructor for SyclQueue failed")

skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(64, queue=q)

with pytest.raises(ValueError):
Expand Down Expand Up @@ -321,6 +322,7 @@ def test_fill_count_out_of_bounds():
pytest.skip("Default constructor for SyclQueue failed")

nbytes = 64
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mem = dpctl.memory.MemoryUSMShared(nbytes, queue=q)

q.fill(mem, 0, nbytes, dtype="u1")
Expand Down
3 changes: 3 additions & 0 deletions dpctl/tests/test_sycl_queue_memcpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@
import dpctl
import dpctl.memory

from .helper import skip_if_usm_unsupported


def _create_memory(q):
nbytes = 1024
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
mobj = dpctl.memory.MemoryUSMShared(nbytes, queue=q)
return mobj

Expand Down
18 changes: 5 additions & 13 deletions dpctl/tests/test_sycl_queue_memset.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@
import dpctl
import dpctl.memory

from .helper import skip_if_usm_unsupported


def _create_memory(q, nbytes=1024):
skip_if_usm_unsupported(dpctl.memory.MemoryUSMShared, q)
return dpctl.memory.MemoryUSMShared(nbytes, queue=q)


Expand All @@ -41,24 +44,13 @@ def _read_back(q, mobj, nbytes):
return bytes(host)


def _skip_if_usm_unsupported(q, mem_cls):
dev = q.sycl_device
supported = {
dpctl.memory.MemoryUSMShared: dev.has_aspect_usm_shared_allocations,
dpctl.memory.MemoryUSMHost: dev.has_aspect_usm_host_allocations,
dpctl.memory.MemoryUSMDevice: dev.has_aspect_usm_device_allocations,
}
if not supported[mem_cls]:
pytest.skip(f"{mem_cls.__name__} is not supported on this device")


@pytest.mark.parametrize("mem_cls", _MEMORY_CLASSES)
def test_memset_fills_whole_allocation(mem_cls):
try:
q = dpctl.SyclQueue()
except dpctl.SyclQueueCreationError:
pytest.skip("Default constructor for SyclQueue failed")
_skip_if_usm_unsupported(q, mem_cls)
skip_if_usm_unsupported(mem_cls, q)
nbytes = 256
mobj = mem_cls(nbytes, queue=q)

Expand Down Expand Up @@ -140,7 +132,7 @@ def test_memset_async(mem_cls):
q = dpctl.SyclQueue()
except dpctl.SyclQueueCreationError:
pytest.skip("Default constructor for SyclQueue failed")
_skip_if_usm_unsupported(q, mem_cls)
skip_if_usm_unsupported(mem_cls, q)
nbytes = 64
mobj = mem_cls(nbytes, queue=q)

Expand Down
Loading
Loading