Skip to content

Commit a5a481e

Browse files
Use manager per queue in tensor implementation
Move implementation from dpctl/utils/__init__.py into dedicated files.
1 parent 106c8de commit a5a481e

21 files changed

+275
-227
lines changed

dpctl/tensor/_accumulation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def _accumulate_common(
126126
out = dpt.permute_dims(out, perm)
127127

128128
final_ev = dpctl.SyclEvent()
129-
_manager = SequentialOrderManager
129+
_manager = SequentialOrderManager[q]
130130
depends = _manager.submitted_events
131131
if implemented_types:
132132
if not include_initial:

dpctl/tensor/_clip.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ def _clip_none(x, val, out, order, _binary_fn):
299299
x = dpt.broadcast_to(x, res_shape)
300300
if val_ary.shape != res_shape:
301301
val_ary = dpt.broadcast_to(val_ary, res_shape)
302-
_manager = SequentialOrderManager
302+
_manager = SequentialOrderManager[exec_q]
303303
dep_evs = _manager.submitted_events
304304
ht_binary_ev, binary_ev = _binary_fn(
305305
src1=x, src2=val_ary, dst=out, sycl_queue=exec_q, depends=dep_evs
@@ -322,7 +322,7 @@ def _clip_none(x, val, out, order, _binary_fn):
322322
buf = _empty_like_orderK(val_ary, res_dt)
323323
else:
324324
buf = dpt.empty_like(val_ary, dtype=res_dt, order=order)
325-
_manager = SequentialOrderManager
325+
_manager = SequentialOrderManager[exec_q]
326326
dep_evs = _manager.submitted_events
327327
ht_copy_ev, copy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
328328
src=val_ary, dst=buf, sycl_queue=exec_q, depends=dep_evs
@@ -449,7 +449,7 @@ def clip(x, /, min=None, max=None, out=None, order="K"):
449449
else:
450450
out = dpt.empty_like(x, order=order)
451451

452-
_manager = SequentialOrderManager
452+
_manager = SequentialOrderManager[exec_q]
453453
dep_evs = _manager.submitted_events
454454
ht_copy_ev, copy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
455455
src=x, dst=out, sycl_queue=exec_q, depends=dep_evs
@@ -672,7 +672,7 @@ def clip(x, /, min=None, max=None, out=None, order="K"):
672672
a_min = dpt.broadcast_to(a_min, res_shape)
673673
if a_max.shape != res_shape:
674674
a_max = dpt.broadcast_to(a_max, res_shape)
675-
_manager = SequentialOrderManager
675+
_manager = SequentialOrderManager[exec_q]
676676
dep_ev = _manager.submitted_events
677677
ht_binary_ev, binary_ev = ti._clip(
678678
src=x,
@@ -700,7 +700,7 @@ def clip(x, /, min=None, max=None, out=None, order="K"):
700700
buf2 = _empty_like_orderK(a_max, buf2_dt)
701701
else:
702702
buf2 = dpt.empty_like(a_max, dtype=buf2_dt, order=order)
703-
_manager = SequentialOrderManager
703+
_manager = SequentialOrderManager[exec_q]
704704
dep_ev = _manager.submitted_events
705705
ht_copy_ev, copy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
706706
src=a_max, dst=buf2, sycl_queue=exec_q, depends=dep_ev
@@ -756,7 +756,7 @@ def clip(x, /, min=None, max=None, out=None, order="K"):
756756
buf1 = _empty_like_orderK(a_min, buf1_dt)
757757
else:
758758
buf1 = dpt.empty_like(a_min, dtype=buf1_dt, order=order)
759-
_manager = SequentialOrderManager
759+
_manager = SequentialOrderManager[exec_q]
760760
dep_ev = _manager.submitted_events
761761
ht_copy_ev, copy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
762762
src=a_min, dst=buf1, sycl_queue=exec_q, depends=dep_ev
@@ -825,7 +825,7 @@ def clip(x, /, min=None, max=None, out=None, order="K"):
825825
else:
826826
buf1 = dpt.empty_like(a_min, dtype=buf1_dt, order=order)
827827

828-
_manager = SequentialOrderManager
828+
_manager = SequentialOrderManager[exec_q]
829829
dep_evs = _manager.submitted_events
830830
ht_copy1_ev, copy1_ev = ti._copy_usm_ndarray_into_usm_ndarray(
831831
src=a_min, dst=buf1, sycl_queue=exec_q, depends=dep_evs

dpctl/tensor/_copy_utils.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ def _copy_to_numpy(ary):
4040
if not isinstance(ary, dpt.usm_ndarray):
4141
raise TypeError(f"Expected dpctl.tensor.usm_ndarray, got {type(ary)}")
4242
nb = ary.usm_data.nbytes
43-
hh = dpm.MemoryUSMHost(nb, queue=ary.sycl_queue)
43+
q = ary.sycl_queue
44+
hh = dpm.MemoryUSMHost(nb, queue=q)
4445
h = np.ndarray(nb, dtype="u1", buffer=hh).view(ary.dtype)
4546
itsz = ary.itemsize
4647
strides_bytes = tuple(si * itsz for si in ary.strides)
4748
offset = ary.__sycl_usm_array_interface__.get("offset", 0) * itsz
4849
# ensure that content of ary.usm_data is final
49-
dpctl.utils.SequentialOrderManager.wait()
50+
q.wait()
5051
hh.copy_from_device(ary.usm_data)
5152
return np.ndarray(
5253
ary.shape,
@@ -105,7 +106,7 @@ def _copy_from_numpy_into(dst, np_ary):
105106
src_ary = src_ary.astype(np.float32)
106107
elif src_ary_dt_c == "D":
107108
src_ary = src_ary.astype(np.complex64)
108-
_manager = dpctl.utils.SequentialOrderManager
109+
_manager = dpctl.utils.SequentialOrderManager[copy_q]
109110
dep_ev = _manager.submitted_events
110111
# synchronizing call
111112
ti._copy_numpy_ndarray_into_usm_ndarray(
@@ -208,7 +209,7 @@ def _copy_overlapping(dst, src):
208209
order="C",
209210
buffer_ctor_kwargs={"queue": q},
210211
)
211-
_manager = dpctl.utils.SequentialOrderManager
212+
_manager = dpctl.utils.SequentialOrderManager[q]
212213
dep_evs = _manager.submitted_events
213214
hcp1, cp1 = ti._copy_usm_ndarray_into_usm_ndarray(
214215
src=src, dst=tmp, sycl_queue=q, depends=dep_evs
@@ -232,10 +233,11 @@ def _copy_same_shape(dst, src):
232233
_copy_overlapping(src=src, dst=dst)
233234
return
234235

235-
_manager = dpctl.utils.SequentialOrderManager
236+
copy_q = dst.sycl_queue
237+
_manager = dpctl.utils.SequentialOrderManager[copy_q]
236238
dep_evs = _manager.submitted_events
237239
hev, cpy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
238-
src=src, dst=dst, sycl_queue=dst.sycl_queue, depends=dep_evs
240+
src=src, dst=dst, sycl_queue=copy_q, depends=dep_evs
239241
)
240242
_manager.add_event_pair(hev, cpy_ev)
241243

@@ -724,7 +726,7 @@ def _extract_impl(ary, ary_mask, axis=0):
724726
cumsum_dt = dpt.int32 if mask_nelems < int32_t_max else dpt.int64
725727
cumsum = dpt.empty(mask_nelems, dtype=cumsum_dt, device=ary_mask.device)
726728
exec_q = cumsum.sycl_queue
727-
_manager = dpctl.utils.SequentialOrderManager
729+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
728730
dep_evs = _manager.submitted_events
729731
mask_count = ti.mask_positions(
730732
ary_mask, cumsum, sycl_queue=exec_q, depends=dep_evs
@@ -760,7 +762,7 @@ def _nonzero_impl(ary):
760762
cumsum = dpt.empty(
761763
mask_nelems, dtype=cumsum_dt, sycl_queue=exec_q, order="C"
762764
)
763-
_manager = dpctl.utils.SequentialOrderManager
765+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
764766
dep_evs = _manager.submitted_events
765767
mask_count = ti.mask_positions(
766768
ary, cumsum, sycl_queue=exec_q, depends=dep_evs
@@ -837,7 +839,7 @@ def _take_multi_index(ary, inds, p):
837839
res = dpt.empty(
838840
res_shape, dtype=ary.dtype, usm_type=res_usm_type, sycl_queue=exec_q
839841
)
840-
_manager = dpctl.utils.SequentialOrderManager
842+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
841843
dep_ev = _manager.submitted_events
842844
hev, take_ev = ti._take(
843845
src=ary,
@@ -890,7 +892,7 @@ def _place_impl(ary, ary_mask, vals, axis=0):
890892
cumsum_dt = dpt.int32 if mask_nelems < int32_t_max else dpt.int64
891893
cumsum = dpt.empty(mask_nelems, dtype=cumsum_dt, device=ary_mask.device)
892894
exec_q = cumsum.sycl_queue
893-
_manager = dpctl.utils.SequentialOrderManager
895+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
894896
dep_ev = _manager.submitted_events
895897
mask_count = ti.mask_positions(
896898
ary_mask, cumsum, sycl_queue=exec_q, depends=dep_ev
@@ -990,7 +992,7 @@ def _put_multi_index(ary, inds, p, vals):
990992
else:
991993
rhs = dpt.astype(vals, ary.dtype)
992994
rhs = dpt.broadcast_to(rhs, expected_vals_shape)
993-
_manager = dpctl.utils.SequentialOrderManager
995+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
994996
dep_ev = _manager.submitted_events
995997
hev, put_ev = ti._put(
996998
dst=ary,

dpctl/tensor/_ctors.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def _asarray_from_usm_ndarray(
159159
)
160160
eq = dpctl.utils.get_execution_queue([usm_ndary.sycl_queue, copy_q])
161161
if eq is not None:
162-
_manager = dpctl.utils.SequentialOrderManager
162+
_manager = dpctl.utils.SequentialOrderManager[eq]
163163
dep_evs = _manager.submitted_events
164164
hev, cpy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
165165
src=usm_ndary, dst=res, sycl_queue=eq, depends=dep_evs
@@ -415,7 +415,7 @@ def _asarray_from_seq(
415415
sycl_queue=alloc_q,
416416
order=order,
417417
)
418-
_manager = dpctl.utils.SequentialOrderManager
418+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
419419
_device_copy_walker(seq_obj, res, _manager)
420420
return res
421421
else:
@@ -854,7 +854,7 @@ def arange(
854854
else:
855855
_step = sc_ty(1)
856856
_start = _first
857-
_manager = dpctl.utils.SequentialOrderManager
857+
_manager = dpctl.utils.SequentialOrderManager[sycl_queue]
858858
# populating newly allocated array, no task dependencies
859859
hev, lin_ev = ti._linspace_step(_start, _step, res, sycl_queue)
860860
_manager.add_event_pair(hev, lin_ev)
@@ -1001,7 +1001,7 @@ def ones(
10011001
order=order,
10021002
buffer_ctor_kwargs={"queue": sycl_queue},
10031003
)
1004-
_manager = dpctl.utils.SequentialOrderManager
1004+
_manager = dpctl.utils.SequentialOrderManager[sycl_queue]
10051005
# populating new allocation, no dependent events
10061006
hev, full_ev = ti._full_usm_ndarray(1, res, sycl_queue)
10071007
_manager.add_event_pair(hev, full_ev)
@@ -1100,7 +1100,7 @@ def full(
11001100
elif fill_value_type is int and np.issubdtype(dtype, np.integer):
11011101
fill_value = _to_scalar(fill_value, dtype)
11021102

1103-
_manager = dpctl.utils.SequentialOrderManager
1103+
_manager = dpctl.utils.SequentialOrderManager[sycl_queue]
11041104
# populating new allocation, no dependent events
11051105
hev, full_ev = ti._full_usm_ndarray(fill_value, res, sycl_queue)
11061106
_manager.add_event_pair(hev, full_ev)
@@ -1480,7 +1480,7 @@ def linspace(
14801480
start = float(start)
14811481
stop = float(stop)
14821482
res = dpt.empty(num, dtype=dt, usm_type=usm_type, sycl_queue=sycl_queue)
1483-
_manager = dpctl.utils.SequentialOrderManager
1483+
_manager = dpctl.utils.SequentialOrderManager[sycl_queue]
14841484
hev, la_ev = ti._linspace_affine(
14851485
start, stop, dst=res, include_endpoint=endpoint, sycl_queue=sycl_queue
14861486
)
@@ -1578,7 +1578,7 @@ def eye(
15781578
buffer_ctor_kwargs={"queue": sycl_queue},
15791579
)
15801580
if n_rows != 0 and n_cols != 0:
1581-
_manager = dpctl.utils.SequentialOrderManager
1581+
_manager = dpctl.utils.SequentialOrderManager[sycl_queue]
15821582
hev, eye_ev = ti._eye(k, dst=res, sycl_queue=sycl_queue)
15831583
_manager.add_event_pair(hev, eye_ev)
15841584
return res
@@ -1630,7 +1630,7 @@ def tril(x, /, *, k=0):
16301630
usm_type=x.usm_type,
16311631
sycl_queue=q,
16321632
)
1633-
_manager = dpctl.utils.SequentialOrderManager
1633+
_manager = dpctl.utils.SequentialOrderManager[q]
16341634
dep_evs = _manager.submitted_events
16351635
hev, cpy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
16361636
src=x, dst=res, sycl_queue=q, depends=dep_evs
@@ -1652,7 +1652,7 @@ def tril(x, /, *, k=0):
16521652
usm_type=x.usm_type,
16531653
sycl_queue=q,
16541654
)
1655-
_manager = dpctl.utils.SequentialOrderManager
1655+
_manager = dpctl.utils.SequentialOrderManager[q]
16561656
dep_evs = _manager.submitted_events
16571657
hev, tril_ev = ti._tril(
16581658
src=x, dst=res, k=k, sycl_queue=q, depends=dep_evs
@@ -1716,7 +1716,7 @@ def triu(x, /, *, k=0):
17161716
usm_type=x.usm_type,
17171717
sycl_queue=q,
17181718
)
1719-
_manager = dpctl.utils.SequentialOrderManager
1719+
_manager = dpctl.utils.SequentialOrderManager[q]
17201720
dep_evs = _manager.submitted_events
17211721
hev, cpy_ev = ti._copy_usm_ndarray_into_usm_ndarray(
17221722
src=x, dst=res, sycl_queue=q, depends=dep_evs
@@ -1730,7 +1730,7 @@ def triu(x, /, *, k=0):
17301730
usm_type=x.usm_type,
17311731
sycl_queue=q,
17321732
)
1733-
_manager = dpctl.utils.SequentialOrderManager
1733+
_manager = dpctl.utils.SequentialOrderManager[q]
17341734
dep_evs = _manager.submitted_events
17351735
hev, triu_ev = ti._triu(
17361736
src=x, dst=res, k=k, sycl_queue=q, depends=dep_evs

dpctl/tensor/_elementwise_common.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def __call__(self, x, /, *, out=None, order="K"):
236236
)
237237

238238
exec_q = x.sycl_queue
239-
_manager = SequentialOrderManager
239+
_manager = SequentialOrderManager[exec_q]
240240
if buf_dt is None:
241241
if out is None:
242242
if order == "K":
@@ -632,7 +632,7 @@ def __call__(self, o1, o2, /, *, out=None, order="K"):
632632
)
633633

634634
orig_out = out
635-
_manager = SequentialOrderManager
635+
_manager = SequentialOrderManager[exec_q]
636636
if out is not None:
637637
if not isinstance(out, dpt.usm_ndarray):
638638
raise TypeError(

dpctl/tensor/_indexing_functions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def take(x, indices, /, *, axis=None, mode="wrap"):
121121
res_shape, dtype=x.dtype, usm_type=res_usm_type, sycl_queue=exec_q
122122
)
123123

124-
_manager = dpctl.utils.SequentialOrderManager
124+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
125125
deps_ev = _manager.submitted_events
126126
hev, take_ev = ti._take(
127127
x, (indices,), res, axis, mode, sycl_queue=exec_q, depends=deps_ev
@@ -278,7 +278,7 @@ def put_vec_duplicates(vec, ind, vals):
278278
rhs = dpt.astype(vals, x.dtype)
279279
rhs = dpt.broadcast_to(rhs, val_shape)
280280

281-
_manager = dpctl.utils.SequentialOrderManager
281+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
282282
deps_ev = _manager.submitted_events
283283
hev, put_ev = ti._put(
284284
x, (indices,), rhs, axis, mode, sycl_queue=exec_q, depends=deps_ev
@@ -375,7 +375,7 @@ def place(arr, mask, vals):
375375
if arr.shape != mask.shape or vals.ndim != 1:
376376
raise ValueError("Array sizes are not as required")
377377
cumsum = dpt.empty(mask.size, dtype="i8", sycl_queue=exec_q)
378-
_manager = dpctl.utils.SequentialOrderManager
378+
_manager = dpctl.utils.SequentialOrderManager[exec_q]
379379
deps_ev = _manager.submitted_events
380380
nz_count = ti.mask_positions(
381381
mask, cumsum, sycl_queue=exec_q, depends=deps_ev

dpctl/tensor/_linear_algebra_functions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def tensordot(x1, x2, axes=2):
189189
"supported types according to the casting rule ''safe''."
190190
)
191191

192-
_manager = SequentialOrderManager
192+
_manager = SequentialOrderManager[exec_q]
193193
if buf1_dt is None and buf2_dt is None:
194194
out = dpt.empty(
195195
res_shape,
@@ -408,7 +408,7 @@ def vecdot(x1, x2, axis=-1):
408408
"supported types according to the casting rule ''safe''."
409409
)
410410

411-
_manager = SequentialOrderManager
411+
_manager = SequentialOrderManager[exec_q]
412412
if buf1_dt is None and buf2_dt is None:
413413
if x1.dtype.kind == "c":
414414
x1_tmp = _empty_like_orderK(x1, x1.dtype)
@@ -791,7 +791,7 @@ def matmul(x1, x2, out=None, dtype=None, order="K"):
791791
else "C"
792792
)
793793

794-
_manager = SequentialOrderManager
794+
_manager = SequentialOrderManager[exec_q]
795795
if buf1_dt is None and buf2_dt is None:
796796
if out is None:
797797
if order == "K":

0 commit comments

Comments
 (0)