Skip to content

Commit e73d536

Browse files
Diptorup Deboleksandr-pavlyk
andcommitted
_sycl_device_factory implements get_num_devices and has_*_device(s), use them in tests intsead of has_cpu_queue,etc. (#320)
Co-authored-by: Oleksandr Pavlyk <[email protected]>
1 parent 7866742 commit e73d536

8 files changed

+120
-31
lines changed

dpctl/_sycl_device_factory.pxd

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,18 @@ from SYCL standard device_selectors, to get a list of SyclDevices for a
2222
specific backend or device_type.
2323
"""
2424

25+
from libcpp cimport bool as cpp_bool
26+
from ._sycl_device cimport SyclDevice
2527

26-
cpdef select_accelerator_device()
27-
cpdef select_cpu_device()
28-
cpdef select_default_device()
29-
cpdef select_gpu_device()
30-
cpdef select_host_device()
28+
cpdef SyclDevice select_accelerator_device()
29+
cpdef SyclDevice select_cpu_device()
30+
cpdef SyclDevice select_default_device()
31+
cpdef SyclDevice select_gpu_device()
32+
cpdef SyclDevice select_host_device()
3133
cpdef list get_devices(backend=*, device_type=*)
34+
cpdef int get_num_devices(backend=*, device_type=*)
35+
cpdef cpp_bool has_gpu_devices()
36+
cpdef cpp_bool has_cpu_devices()
37+
cpdef cpp_bool has_accelerator_devices()
38+
cpdef cpp_bool has_host_device()
39+

dpctl/_sycl_device_factory.pyx

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ from ._backend cimport (
3333
DPCTLDefaultSelector_Create,
3434
DPCTLDevice_CreateFromSelector,
3535
DPCTLDeviceMgr_GetDevices,
36+
DPCTLDeviceMgr_GetNumDevices,
3637
DPCTLDeviceSelector_Delete,
3738
DPCTLDeviceVectorRef,
3839
DPCTLDeviceVector_Delete,
@@ -45,7 +46,6 @@ from ._backend cimport (
4546
DPCTLSyclDeviceSelectorRef,
4647
DPCTLSyclDeviceType,
4748
)
48-
from ._sycl_device cimport SyclDevice
4949
from . import backend_type, device_type as device_type_t
5050

5151
__all__ = [
@@ -55,6 +55,11 @@ __all__ = [
5555
"select_default_device",
5656
"select_gpu_device",
5757
"select_host_device",
58+
"get_num_devices",
59+
"has_cpu_devices",
60+
"has_gpu_devices",
61+
"has_accelerator_devices",
62+
"has_host_device",
5863
]
5964

6065

@@ -174,7 +179,65 @@ cpdef list get_devices(backend=backend_type.all, device_type=device_type_t.all):
174179
return devices
175180

176181

177-
cpdef select_accelerator_device():
182+
cpdef int get_num_devices(backend=backend_type.all, device_type=device_type_t.all):
183+
cdef DPCTLSyclBackendType BTy = _backend_type._ALL_BACKENDS
184+
cdef DPCTLSyclDeviceType DTy = _device_type._ALL_DEVICES
185+
cdef int num_devices = 0
186+
187+
if isinstance(backend, str):
188+
BTy = _string_to_dpctl_sycl_backend_ty(backend)
189+
elif isinstance(backend, backend_type):
190+
BTy = _enum_to_dpctl_sycl_backend_ty(backend)
191+
else:
192+
raise TypeError(
193+
"backend should be specified as a str or an "
194+
"enum_types.backend_type"
195+
)
196+
197+
if isinstance(device_type, str):
198+
DTy = _string_to_dpctl_sycl_device_ty(device_type)
199+
elif isinstance(device_type, device_type_t):
200+
DTy = _enum_to_dpctl_sycl_device_ty(device_type)
201+
else:
202+
raise TypeError(
203+
"device type should be specified as a str or an "
204+
"enum_types.device_type"
205+
)
206+
207+
num_devices = DPCTLDeviceMgr_GetNumDevices(BTy | DTy)
208+
209+
return num_devices
210+
211+
212+
cpdef cpp_bool has_cpu_devices():
213+
""" Returns: True if `sycl::device_type::cpu` devices are present, False otherwise
214+
"""
215+
cdef int num_cpu_dev = DPCTLDeviceMgr_GetNumDevices(_device_type._CPU)
216+
return <cpp_bool>num_cpu_dev
217+
218+
219+
cpdef cpp_bool has_gpu_devices():
220+
""" Returns: True if `sycl::device_type::gpu` devices are present, False otherwise
221+
"""
222+
cdef int num_gpu_dev = DPCTLDeviceMgr_GetNumDevices(_device_type._GPU)
223+
return <cpp_bool>num_gpu_dev
224+
225+
226+
cpdef cpp_bool has_accelerator_devices():
227+
""" Returns: True if `sycl::device_type::accelerator` devices are present, False otherwise
228+
"""
229+
cdef int num_accelerator_dev = DPCTLDeviceMgr_GetNumDevices(_device_type._ACCELERATOR)
230+
return <cpp_bool>num_accelerator_dev
231+
232+
233+
cpdef cpp_bool has_host_device():
234+
""" Returns: True if `sycl::device_type::host` devices are present, False otherwise
235+
"""
236+
cdef int num_host_dev = DPCTLDeviceMgr_GetNumDevices(_device_type._HOST_DEVICE)
237+
return <cpp_bool>num_host_dev
238+
239+
240+
cpdef SyclDevice select_accelerator_device():
178241
""" A wrapper for SYCL's `accelerator_selector` device_selector class.
179242
180243
Returns:
@@ -194,7 +257,7 @@ cpdef select_accelerator_device():
194257
return Device
195258

196259

197-
cpdef select_cpu_device():
260+
cpdef SyclDevice select_cpu_device():
198261
""" A wrapper for SYCL's `cpu_selector` device_selector class.
199262
200263
Returns:
@@ -214,7 +277,7 @@ cpdef select_cpu_device():
214277
return Device
215278

216279

217-
cpdef select_default_device():
280+
cpdef SyclDevice select_default_device():
218281
""" A wrapper for SYCL's `default_selector` device_selector class.
219282
220283
Returns:
@@ -234,7 +297,7 @@ cpdef select_default_device():
234297
return Device
235298

236299

237-
cpdef select_gpu_device():
300+
cpdef SyclDevice select_gpu_device():
238301
""" A wrapper for SYCL's `gpu_selector` device_selector class.
239302
240303
Returns:
@@ -254,7 +317,7 @@ cpdef select_gpu_device():
254317
return Device
255318

256319

257-
cpdef select_host_device():
320+
cpdef SyclDevice select_host_device():
258321
""" A wrapper for SYCL's `host_selector` device_selector class.
259322
260323
Returns:

dpctl/tests/_helper.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import dpctl
2+
3+
4+
def has_gpu(backend="opencl"):
5+
return bool(dpctl.get_num_devices(backend=backend, device_type="gpu"))
6+
7+
8+
def has_cpu(backend="opencl"):
9+
return bool(dpctl.get_num_devices(backend=backend, device_type="cpu"))

dpctl/tests/test_sycl_kernel_submit.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
import dpctl.memory as dpctl_mem
2424
import dpctl.program as dpctl_prog
2525
import numpy as np
26+
from ._helper import has_cpu, has_gpu
2627

2728

28-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
29+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
2930
class Test1DKernelSubmit(unittest.TestCase):
3031
def test_create_program_from_source(self):
3132
oclSrc = " \

dpctl/tests/test_sycl_program.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
import dpctl.program as dpctl_prog
2222
import unittest
2323
import os
24+
from ._helper import has_cpu, has_gpu
2425

2526

26-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
27+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
2728
class TestProgramFromOCLSource(unittest.TestCase):
2829
def test_create_program_from_source(self):
2930
oclSrc = " \
@@ -52,7 +53,7 @@ def test_create_program_from_source(self):
5253
self.assertEqual(axpyKernel.get_num_args(), 4)
5354

5455

55-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
56+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
5657
class TestProgramFromSPRIV(unittest.TestCase):
5758
def test_create_program_from_spirv(self):
5859

@@ -77,7 +78,7 @@ def test_create_program_from_spirv(self):
7778

7879

7980
@unittest.skipUnless(
80-
dpctl.has_gpu_queues(backend_ty=dpctl.backend_type.level_zero),
81+
has_gpu(backend=dpctl.backend_type.level_zero),
8182
"No Level0 GPU queues available",
8283
)
8384
class TestProgramForLevel0GPU(unittest.TestCase):

dpctl/tests/test_sycl_queue.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,26 @@
1919

2020
import dpctl
2121
import unittest
22+
from ._helper import has_cpu, has_gpu
2223

2324

2425
class TestSyclQueue(unittest.TestCase):
25-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
26-
@unittest.skipUnless(dpctl.has_cpu_queues(), "No OpenCL CPU queues available")
26+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
27+
@unittest.skipUnless(has_cpu(), "No OpenCL CPU queues available")
2728
def test_queue_not_equals(self):
28-
with dpctl.device_context("opencl:gpu") as gpuQ0:
29+
with dpctl.device_context("opencl:gpu") as gpuQ:
30+
ctx_gpu = gpuQ.get_sycl_context()
2931
with dpctl.device_context("opencl:cpu") as cpuQ:
30-
self.assertFalse(cpuQ.equals(gpuQ0))
32+
ctx_cpu = cpuQ.get_sycl_context()
33+
self.assertFalse(ctx_cpu.equals(ctx_gpu))
3134

32-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
35+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
3336
def test_queue_equals(self):
3437
with dpctl.device_context("opencl:gpu") as gpuQ0:
38+
ctx0 = gpuQ0.get_sycl_context()
3539
with dpctl.device_context("opencl:gpu") as gpuQ1:
36-
self.assertTrue(gpuQ0.equals(gpuQ1))
40+
ctx1 = gpuQ1.get_sycl_context()
41+
self.assertTrue(ctx0.equals(ctx1))
3742

3843

3944
if __name__ == "__main__":

dpctl/tests/test_sycl_queue_manager.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import dpctl
2121
import unittest
22+
from ._helper import has_cpu, has_gpu
2223

2324

2425
class TestGetNumPlatforms(unittest.TestCase):
@@ -48,13 +49,13 @@ class TestIsInDeviceContext(unittest.TestCase):
4849
def test_is_in_device_context_outside_device_ctxt(self):
4950
self.assertFalse(dpctl.is_in_device_context())
5051

51-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
52+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
5253
def test_is_in_device_context_inside_device_ctxt(self):
5354
with dpctl.device_context("opencl:gpu:0"):
5455
self.assertTrue(dpctl.is_in_device_context())
5556

56-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
57-
@unittest.skipUnless(dpctl.has_cpu_queues(), "No OpenCL CPU queues available")
57+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
58+
@unittest.skipUnless(has_cpu(), "No OpenCL CPU queues available")
5859
def test_is_in_device_context_inside_nested_device_ctxt(self):
5960
with dpctl.device_context("opencl:cpu:0"):
6061
with dpctl.device_context("opencl:gpu:0"):
@@ -76,7 +77,7 @@ def test_get_current_device_type_inside_device_ctxt(self):
7677

7778
self.assertNotEqual(dpctl.get_current_device_type(), None)
7879

79-
@unittest.skipUnless(dpctl.has_cpu_queues(), "No OpenCL CPU queues available")
80+
@unittest.skipUnless(has_cpu(), "No OpenCL CPU queues available")
8081
def test_get_current_device_type_inside_nested_device_ctxt(self):
8182
self.assertNotEqual(dpctl.get_current_device_type(), None)
8283

@@ -95,17 +96,17 @@ class TestGetCurrentQueueInMultipleThreads(unittest.TestCase):
9596
def test_num_current_queues_outside_with_clause(self):
9697
self.assertEqual(dpctl.get_num_activated_queues(), 0)
9798

98-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
99-
@unittest.skipUnless(dpctl.has_cpu_queues(), "No OpenCL CPU queues available")
99+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
100+
@unittest.skipUnless(has_cpu(), "No OpenCL CPU queues available")
100101
def test_num_current_queues_inside_with_clause(self):
101102
with dpctl.device_context("opencl:cpu:0"):
102103
self.assertEqual(dpctl.get_num_activated_queues(), 1)
103104
with dpctl.device_context("opencl:gpu:0"):
104105
self.assertEqual(dpctl.get_num_activated_queues(), 2)
105106
self.assertEqual(dpctl.get_num_activated_queues(), 0)
106107

107-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
108-
@unittest.skipUnless(dpctl.has_cpu_queues(), "No OpenCL CPU queues available")
108+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
109+
@unittest.skipUnless(has_cpu(), "No OpenCL CPU queues available")
109110
def test_num_current_queues_inside_threads(self):
110111
from threading import Thread
111112

dpctl/tests/test_sycl_usm.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import dpctl
2222
from dpctl.memory import MemoryUSMShared, MemoryUSMHost, MemoryUSMDevice
2323
import numpy as np
24+
from ._helper import has_cpu, has_gpu
2425

2526

2627
class Dummy(MemoryUSMShared):
@@ -76,7 +77,7 @@ def test_memory_without_context(self):
7677
# Without context
7778
self.assertEqual(mobj.get_usm_type(), "shared")
7879

79-
@unittest.skipUnless(dpctl.has_cpu_queues(), "No OpenCL CPU queues available")
80+
@unittest.skipUnless(has_cpu(), "No OpenCL CPU queues available")
8081
def test_memory_cpu_context(self):
8182
mobj = self._create_memory()
8283

@@ -94,7 +95,7 @@ def test_memory_cpu_context(self):
9495
# not in the same SYCL context
9596
self.assertTrue(usm_type in ["unknown", "shared"])
9697

97-
@unittest.skipUnless(dpctl.has_gpu_queues(), "No OpenCL GPU queues available")
98+
@unittest.skipUnless(has_gpu(), "No OpenCL GPU queues available")
9899
def test_memory_gpu_context(self):
99100
mobj = self._create_memory()
100101

0 commit comments

Comments
 (0)