Skip to content

Commit 7c248e7

Browse files
Implemented SyclQueue.submit_barrier
1 parent b6710ed commit 7c248e7

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

dpctl/_backend.pxd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,12 @@ cdef extern from "dpctl_sycl_queue_interface.h":
347347
size_t Count,
348348
int Advice)
349349
cdef bool DPCTLQueue_IsInOrder(const DPCTLSyclQueueRef QRef)
350+
cdef DPCTLSyclEventRef DPCTLQueue_SubmitBarrier(
351+
const DPCTLSyclQueueRef QRef)
352+
cdef DPCTLSyclEventRef DPCTLQueue_SubmitBarrierForEvents(
353+
const DPCTLSyclQueueRef QRef,
354+
const DPCTLSyclEventRef *DepEvents,
355+
size_t NDepEvents)
350356

351357

352358
cdef extern from "dpctl_sycl_queue_manager.h":

dpctl/_sycl_queue.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,4 @@ cdef public class SyclQueue (_SyclQueue) [object PySyclQueueObject, type PySyclQ
8181
cpdef memcpy(self, dest, src, size_t count)
8282
cpdef prefetch(self, ptr, size_t count=*)
8383
cpdef mem_advise(self, ptr, size_t count, int mem)
84+
cpdef SyclEvent submit_barrier(self, dependent_events=*)

dpctl/_sycl_queue.pyx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ from ._backend cimport ( # noqa: E211
4343
DPCTLQueue_MemAdvise,
4444
DPCTLQueue_Memcpy,
4545
DPCTLQueue_Prefetch,
46+
DPCTLQueue_SubmitBarrierForEvents,
4647
DPCTLQueue_SubmitNDRange,
4748
DPCTLQueue_SubmitRange,
4849
DPCTLQueue_Wait,
@@ -63,6 +64,7 @@ from .enum_types import backend_type
6364
from cpython cimport pycapsule
6465
from libc.stdlib cimport free, malloc
6566

67+
import collections.abc
6668
import logging
6769

6870
__all__ = [
@@ -879,3 +881,38 @@ cdef class SyclQueue(_SyclQueue):
879881
return pycapsule.PyCapsule_New(
880882
<void *>QRef, "SyclQueueRef", &_queue_capsule_deleter
881883
)
884+
885+
cpdef SyclEvent submit_barrier(self, dependent_events=None):
886+
"""
887+
Submits a barrier to the queue.
888+
"""
889+
cdef DPCTLSyclEventRef *depEvents = NULL
890+
cdef DPCTLSyclEventRef ERef = NULL
891+
cdef size_t nDE = 0
892+
# Create the array of dependent events if any
893+
if (dependent_events is None or
894+
(isinstance(dependent_events, collections.abc.Sequence) and
895+
all([type(de) is SyclEvent for de in dependent_events]))):
896+
nDE = 0 if dependent_events is None else len(dependent_events)
897+
else:
898+
raise TypeError(
899+
"dependent_events must either None, or a sequence of "
900+
":class:`dpctl.SyclEvent` objects")
901+
if nDE > 0:
902+
depEvents = (
903+
<DPCTLSyclEventRef*>malloc(nDE*sizeof(DPCTLSyclEventRef))
904+
)
905+
if not depEvents:
906+
raise MemoryError()
907+
else:
908+
for idx, de in enumerate(dependent_events):
909+
depEvents[idx] = (<SyclEvent>de).get_event_ref()
910+
ERef = DPCTLQueue_SubmitBarrierForEvents(
911+
self.get_queue_ref(), depEvents, nDE)
912+
free(depEvents)
913+
if ERef is NULL:
914+
raise SyclKernelSubmitError(
915+
"Barrier submission to Sycl queue failed."
916+
)
917+
918+
return SyclEvent._create(ERef, [])

dpctl/tests/test_sycl_queue.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,16 @@ def test_hashing_of_queue():
381381
"""
382382
queue_dict = {dpctl.SyclQueue(): "default_queue"}
383383
assert queue_dict
384+
385+
386+
def test_queue_submit_barrier(valid_filter):
387+
try:
388+
q = dpctl.SyclQueue(valid_filter)
389+
except dpctl.SyclQueueCreationError:
390+
pytest.skip("Failed to create device with supported filter")
391+
ev1 = q.submit_barrier()
392+
ev2 = q.submit_barrier()
393+
ev3 = q.submit_barrier([ev1, ev2])
394+
ev3.wait()
395+
ev1.wait()
396+
ev2.wait()

0 commit comments

Comments
 (0)