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{}}; 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);