From 332febc2f12960e31452b82964117ff49e2781b3 Mon Sep 17 00:00:00 2001 From: "Larsen, Steffen" Date: Wed, 1 Oct 2025 04:35:47 -0700 Subject: [PATCH 1/3] [SYCL] Reintroduce barrier trivial event for empty in-order queue The changes in https://github.com/intel/llvm/pull/20159 removed a test case checking that barriers on empty queues would be considered complete immediately. This commit reintroduces it with a fix for the case. Signed-off-by: Larsen, Steffen --- sycl/source/queue.cpp | 8 ++++++++ .../in_order_ext_oneapi_submit_barrier.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/sycl/source/queue.cpp b/sycl/source/queue.cpp index 64ed07032ddc9..429efc16053cc 100644 --- a/sycl/source/queue.cpp +++ b/sycl/source/queue.cpp @@ -366,6 +366,14 @@ event queue::ext_oneapi_submit_barrier(const std::vector &WaitList, !EventImpl.hasCommandGraph(); }); + // If we have an empty in-order queue and no dependencies, we can just return + // a trivially finished event. + if (is_in_order() && !impl->hasCommandGraph() && !impl->MIsProfilingEnabled && + AllEventsEmptyOrNop && ext_oneapi_empty()) { + return detail::createSyclObjFromImpl( + detail::event_impl::create_default_event()); + } + if (WaitList.empty() || AllEventsEmptyOrNop) return submit([=](handler &CGH) { CGH.ext_oneapi_barrier(); }, CodeLoc); else diff --git a/sycl/test-e2e/InorderQueue/in_order_ext_oneapi_submit_barrier.cpp b/sycl/test-e2e/InorderQueue/in_order_ext_oneapi_submit_barrier.cpp index f2b1fba5b9359..593d3b415f59e 100644 --- a/sycl/test-e2e/InorderQueue/in_order_ext_oneapi_submit_barrier.cpp +++ b/sycl/test-e2e/InorderQueue/in_order_ext_oneapi_submit_barrier.cpp @@ -60,6 +60,16 @@ int main() { Q.wait(); assert(*Res == 10); } + { + // Test cast 3 - empty queue. + std::cout << "Test 3" << std::endl; + sycl::queue EmptyQ({sycl::property::queue::in_order{}}); + auto BarrierEvent = EmptyQ.ext_oneapi_submit_barrier(); + assert( + BarrierEvent.get_info() == + sycl::info::event_command_status::complete); + BarrierEvent.wait(); + } { // Test cast 4 - graph. sycl::queue GQueue{sycl::property::queue::in_order{}}; From c9355e3c843bdf09104dcc2210892c1f11115fb5 Mon Sep 17 00:00:00 2001 From: "Larsen, Steffen" Date: Wed, 1 Oct 2025 05:38:24 -0700 Subject: [PATCH 2/3] Trick unittest to avoid work-around Signed-off-by: Larsen, Steffen --- sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp b/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp index 2b96e0b8b7c0a..927685791cfed 100644 --- a/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp +++ b/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +#include #include #include #include @@ -39,6 +40,11 @@ class ExtOneapiBarrierOptTest : public ::testing::Test { TEST_F(ExtOneapiBarrierOptTest, EmptyEventTest) { sycl::queue q1{{sycl::property::queue::in_order()}}; + // To avoid current optimizations for empty queues, we trick q1 into thinking + // that it isn't empty. + int dummyInt; + q1.prefetch(&dummyInt, sizeof(int)); + mock::getCallbacks().set_after_callback( "urEnqueueEventsWaitWithBarrierExt", &redefinedEnqueueEventsWaitWithBarrierExt); From a7b2187c6a66270dc14d92630f4c60b47fb4f518 Mon Sep 17 00:00:00 2001 From: "Larsen, Steffen" Date: Wed, 1 Oct 2025 07:07:53 -0700 Subject: [PATCH 3/3] Initialize int to avoid warning Signed-off-by: Larsen, Steffen --- sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp b/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp index 927685791cfed..3b7acbe284619 100644 --- a/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp +++ b/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp @@ -42,7 +42,7 @@ TEST_F(ExtOneapiBarrierOptTest, EmptyEventTest) { // To avoid current optimizations for empty queues, we trick q1 into thinking // that it isn't empty. - int dummyInt; + int dummyInt = 0; q1.prefetch(&dummyInt, sizeof(int)); mock::getCallbacks().set_after_callback(