Skip to content

Commit 2ae91f6

Browse files
committed
[SYCL] Fix barrier on barrier dependency between queues
Currently for the pattern like this: sycl::event eb1 = q1.ext_oneapi_submit_barrier(); q2.ext_oneapi_submit_barrier({ eb1 }); the second barrier ignores eb1 in the waitlist because it is not marked as enqueued even though it is supposed to. This PR fixes that. Fixes #19777
1 parent 72b85b6 commit 2ae91f6

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

sycl/source/detail/queue_impl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ class queue_impl : public std::enable_shared_from_this<queue_impl> {
662662
getAdapter().call<UrApiKind::urEnqueueEventsWait>(getHandleRef(), 0,
663663
nullptr, &UREvent);
664664
ResEvent->setHandle(UREvent);
665+
ResEvent->setEnqueued();
665666
return ResEvent;
666667
}
667668

sycl/unittests/queue/Barrier.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@
88

99
#include <helpers/TestKernel.hpp>
1010
#include <helpers/UrMock.hpp>
11+
#include <sycl/sycl.hpp>
1112

1213
#include <gtest/gtest.h>
1314

1415
static unsigned NumOfEventsWaitWithBarrierCalls = 0;
16+
static unsigned NumEventsInWaitList = 0;
1517

16-
static ur_result_t redefined_urEnqueueEventsWaitWithBarrierExt(void *) {
18+
static ur_result_t redefined_urEnqueueEventsWaitWithBarrierExt(void *pParams) {
1719
NumOfEventsWaitWithBarrierCalls++;
20+
// Get the number of events in the wait list
21+
auto params = *static_cast<ur_enqueue_events_wait_with_barrier_ext_params_t *>(pParams);
22+
NumEventsInWaitList = *params.pnumEventsInWaitList;
1823

1924
return UR_RESULT_SUCCESS;
2025
}
@@ -94,3 +99,18 @@ TEST(Queue, ExtOneAPISubmitBarrierWithWaitList) {
9499

95100
ASSERT_EQ(NumOfEventsWaitWithBarrierCalls, 1u);
96101
}
102+
103+
TEST(Queue, BarrierWithBarrierDep) {
104+
sycl::unittest::UrMock<> Mock;
105+
mock::getCallbacks().set_before_callback(
106+
"urEnqueueEventsWaitWithBarrierExt",
107+
&redefined_urEnqueueEventsWaitWithBarrierExt);
108+
sycl::queue Q1(sycl::property::queue::in_order{});
109+
sycl::queue Q2(sycl::property::queue::in_order{});
110+
Q1.submit(
111+
[&](sycl::handler &cgh) { cgh.single_task<TestKernel>([=]() {}); });
112+
sycl::event Barrier1 = Q1.ext_oneapi_submit_barrier();
113+
NumEventsInWaitList = 0;
114+
Q2.ext_oneapi_submit_barrier({Barrier1});
115+
ASSERT_EQ(NumEventsInWaitList, 1u);
116+
}

0 commit comments

Comments
 (0)