From bf25f84c4990102ca9d7efbb5e909cd8eaf99ccb Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Thu, 2 Oct 2025 14:50:35 +0200 Subject: [PATCH] [SYCL] Reintroduce barrier trivial event for empty in-order queue (#20263) 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 ++++++++++ sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/sycl/source/queue.cpp b/sycl/source/queue.cpp index f2519fe311d12..7ec2a30fbbe91 100644 --- a/sycl/source/queue.cpp +++ b/sycl/source/queue.cpp @@ -359,6 +359,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{}}; diff --git a/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp b/sycl/unittests/Extensions/ExtOneapiBarrierOpt.cpp index 2b96e0b8b7c0a..3b7acbe284619 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 = 0; + q1.prefetch(&dummyInt, sizeof(int)); + mock::getCallbacks().set_after_callback( "urEnqueueEventsWaitWithBarrierExt", &redefinedEnqueueEventsWaitWithBarrierExt);