Skip to content

Commit c4fc6f0

Browse files
Add a wait_list method for SyclEventRaw class (#527)
1 parent 0b9f376 commit c4fc6f0

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

dpctl/_backend.pxd

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ cdef extern from "dpctl_sycl_event_interface.h":
229229
cdef void DPCTLEvent_Delete(DPCTLSyclEventRef ERef)
230230
cdef _event_status_type DPCTLEvent_GetCommandExecutionStatus(DPCTLSyclEventRef ERef)
231231
cdef _backend_type DPCTLEvent_GetBackend(DPCTLSyclEventRef ERef)
232+
cdef struct DPCTLEventVector
233+
ctypedef DPCTLEventVector *DPCTLEventVectorRef
234+
cdef void DPCTLEventVector_Delete(DPCTLEventVectorRef EVRef)
235+
cdef size_t DPCTLEventVector_Size(DPCTLEventVectorRef EVRef)
236+
cdef DPCTLSyclEventRef DPCTLEventVector_GetAt(
237+
DPCTLEventVectorRef EVRef,
238+
size_t index)
239+
cdef DPCTLEventVectorRef DPCTLEvent_GetWaitList(
240+
DPCTLSyclEventRef ERef)
232241

233242

234243
cdef extern from "dpctl_sycl_kernel_interface.h":

dpctl/_sycl_event.pyx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ from ._backend cimport ( # noqa: E211
3131
DPCTLEvent_Delete,
3232
DPCTLEvent_GetBackend,
3333
DPCTLEvent_GetCommandExecutionStatus,
34+
DPCTLEvent_GetWaitList,
3435
DPCTLEvent_Wait,
36+
DPCTLEventVector_Delete,
37+
DPCTLEventVector_GetAt,
38+
DPCTLEventVector_Size,
39+
DPCTLEventVectorRef,
3540
DPCTLSyclEventRef,
3641
_backend_type,
3742
_event_status_type,
@@ -247,3 +252,20 @@ cdef class SyclEventRaw(_SyclEventRaw):
247252
return backend_type.cuda
248253
else:
249254
raise ValueError("Unknown backend type.")
255+
256+
def get_wait_list(self):
257+
cdef DPCTLEventVectorRef EVRef = DPCTLEvent_GetWaitList(
258+
self.get_event_ref()
259+
)
260+
cdef size_t num_events
261+
cdef size_t i
262+
cdef DPCTLSyclEventRef ERef
263+
if (EVRef is NULL):
264+
raise ValueError("Internal error: NULL event vector encountered")
265+
num_events = DPCTLEventVector_Size(EVRef)
266+
events = []
267+
for i in range(num_events):
268+
ERef = DPCTLEventVector_GetAt(EVRef, i)
269+
events.append(SyclEventRaw._create(ERef))
270+
DPCTLEventVector_Delete(EVRef)
271+
return events

dpctl/tests/test_sycl_event.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,50 @@ def test_backend():
8787
dpctl.SyclEventRaw().backend
8888
except ValueError:
8989
pytest.fail("Failed to get backend from event")
90+
91+
92+
@pytest.mark.skip(reason="event::get_wait_list() method returns wrong result")
93+
def test_get_wait_list():
94+
if has_cpu():
95+
oclSrc = " \
96+
kernel void add_k(global float* a) { \
97+
size_t index = get_global_id(0); \
98+
a[index] = a[index] + 1; \
99+
} \
100+
kernel void sqrt_k(global float* a) { \
101+
size_t index = get_global_id(0); \
102+
a[index] = sqrt(a[index]); \
103+
} \
104+
kernel void sin_k(global float* a) { \
105+
size_t index = get_global_id(0); \
106+
a[index] = sin(a[index]); \
107+
}"
108+
q = dpctl.SyclQueue("opencl:cpu")
109+
prog = dpctl_prog.create_program_from_source(q, oclSrc)
110+
addKernel = prog.get_sycl_kernel("add_k")
111+
sqrtKernel = prog.get_sycl_kernel("sqrt_k")
112+
sinKernel = prog.get_sycl_kernel("sin_k")
113+
114+
bufBytes = 1024 * np.dtype("f").itemsize
115+
abuf = dpctl_mem.MemoryUSMShared(bufBytes, queue=q)
116+
a = np.ndarray((1024), buffer=abuf, dtype="f")
117+
a[:] = np.arange(1024)
118+
args = []
119+
120+
args.append(a.base)
121+
r = [1024]
122+
ev_1 = q.submit(addKernel, args, r)
123+
ev_2 = q.submit(sqrtKernel, args, r, dEvents=[ev_1])
124+
ev_3 = q.submit(sinKernel, args, r, dEvents=[ev_2])
125+
126+
ev_raw = dpctl.SyclEventRaw(ev_3)
127+
128+
try:
129+
wait_list = ev_raw.get_wait_list()
130+
except ValueError:
131+
pytest.fail(
132+
"Failed to get a list of waiting events from SyclEventRaw"
133+
)
134+
assert len(wait_list)
135+
else:
136+
pytest.skip("No OpenCL CPU queues available")

0 commit comments

Comments
 (0)