Skip to content

Commit 5d4a55f

Browse files
dpctl.tensor.Device keeps and uses cache for mapping unpartitioned devices to queues
As a result of this `X = dpt.empty((10,), device="gpu")` and `Y=dpt.empty((10,), device="gpu")` would have the same associated queue, i.e. `X.sycl_queue is Y.sycl_queue` would give True
1 parent f4847d2 commit 5d4a55f

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

dpctl/tensor/_device.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class Device:
2929
or ``sycl_device``.
3030
"""
3131

32+
__device_queue_map__ = dict()
33+
3234
def __new__(cls, *args, **kwargs):
3335
raise TypeError("No public constructor")
3436

@@ -55,7 +57,9 @@ def create_device(cls, dev):
5557
elif isinstance(dev, dpctl.SyclDevice):
5658
par = dev.parent_device
5759
if par is None:
58-
obj.sycl_queue_ = dpctl.SyclQueue(dev)
60+
if dev not in cls.__device_queue_map__:
61+
cls.__device_queue_map__[dev] = dpctl.SyclQueue(dev)
62+
obj.sycl_queue_ = cls.__device_queue_map__[dev]
5963
else:
6064
raise ValueError(
6165
"Using non-root device {} to specify offloading "
@@ -64,9 +68,12 @@ def create_device(cls, dev):
6468
)
6569
else:
6670
if dev is None:
67-
obj.sycl_queue_ = dpctl.SyclQueue()
71+
_dev = dpctl.SyclDevice()
6872
else:
69-
obj.sycl_queue_ = dpctl.SyclQueue(dev)
73+
_dev = dpctl.SyclDevice(dev)
74+
if _dev not in cls.__device_queue_map__:
75+
cls.__device_queue_map__[_dev] = dpctl.SyclQueue(_dev)
76+
obj.sycl_queue_ = cls.__device_queue_map__[_dev]
7077
return obj
7178

7279
@property

0 commit comments

Comments
 (0)