From a401f177c7918ec1639b3ca1c1c303eb7811184a Mon Sep 17 00:00:00 2001 From: "Ptak, Slawomir" Date: Fri, 4 Apr 2025 14:35:56 +0000 Subject: [PATCH] [SYCL] Avoid event_impl shared_ptr copy Avoid the event_impl shared_ptr copy by removing a temporary variable and using a reference instead. --- sycl/source/handler.cpp | 62 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/sycl/source/handler.cpp b/sycl/source/handler.cpp index ffb28d2ab6ff9..b63825e6e8cfe 100644 --- a/sycl/source/handler.cpp +++ b/sycl/source/handler.cpp @@ -488,7 +488,19 @@ event handler::finalize() { // creation. std::vector RawEvents = detail::Command::getUrEvents(impl->CGData.MEvents, MQueue, false); - detail::EventImplPtr NewEvent; + const detail::EventImplPtr &LastEventImpl = + detail::getSyclObjImpl(MLastEvent); + + bool DiscardEvent = (MQueue->MDiscardEvents || !impl->MEventNeeded) && + MQueue->supportsDiscardingPiEvents(); + if (DiscardEvent) { + // Kernel only uses assert if it's non interop one + bool KernelUsesAssert = + !(MKernel && MKernel->isInterop()) && + detail::ProgramManager::getInstance().kernelUsesAssert( + MKernelName.c_str()); + DiscardEvent = !KernelUsesAssert; + } #ifdef XPTI_ENABLE_INSTRUMENTATION // uint32_t StreamID, uint64_t InstanceID, xpti_td* TraceEvent, @@ -511,53 +523,41 @@ event handler::finalize() { detail::retrieveKernelBinary(MQueue, MKernelName.c_str()); assert(BinImage && "Failed to obtain a binary image."); } - enqueueImpKernel(MQueue, impl->MNDRDesc, impl->MArgs, - KernelBundleImpPtr, MKernel, MKernelName.c_str(), - RawEvents, NewEvent, nullptr, impl->MKernelCacheConfig, - impl->MKernelIsCooperative, - impl->MKernelUsesClusterLaunch, - impl->MKernelWorkGroupMemorySize, BinImage); + enqueueImpKernel( + MQueue, impl->MNDRDesc, impl->MArgs, KernelBundleImpPtr, MKernel, + MKernelName.c_str(), RawEvents, + DiscardEvent ? detail::EventImplPtr{} : LastEventImpl, nullptr, + impl->MKernelCacheConfig, impl->MKernelIsCooperative, + impl->MKernelUsesClusterLaunch, impl->MKernelWorkGroupMemorySize, + BinImage); #ifdef XPTI_ENABLE_INSTRUMENTATION // Emit signal only when event is created - if (NewEvent != nullptr) { + if (!DiscardEvent) { detail::emitInstrumentationGeneral( StreamID, InstanceID, CmdTraceEvent, xpti::trace_signal, - static_cast(NewEvent->getHandle())); + static_cast(LastEventImpl->getHandle())); } detail::emitInstrumentationGeneral(StreamID, InstanceID, CmdTraceEvent, xpti::trace_task_end, nullptr); #endif }; - bool DiscardEvent = (MQueue->MDiscardEvents || !impl->MEventNeeded) && - MQueue->supportsDiscardingPiEvents(); - if (DiscardEvent) { - // Kernel only uses assert if it's non interop one - bool KernelUsesAssert = - !(MKernel && MKernel->isInterop()) && - detail::ProgramManager::getInstance().kernelUsesAssert( - MKernelName.c_str()); - DiscardEvent = !KernelUsesAssert; - } - if (DiscardEvent) { EnqueueKernel(); - const auto &EventImpl = detail::getSyclObjImpl(MLastEvent); - EventImpl->setStateDiscarded(); + LastEventImpl->setStateDiscarded(); } else { - NewEvent = detail::getSyclObjImpl(MLastEvent); - NewEvent->setQueue(MQueue); - NewEvent->setWorkerQueue(MQueue); - NewEvent->setContextImpl(MQueue->getContextImplPtr()); - NewEvent->setStateIncomplete(); - NewEvent->setSubmissionTime(); + LastEventImpl->setQueue(MQueue); + LastEventImpl->setWorkerQueue(MQueue); + LastEventImpl->setContextImpl(MQueue->getContextImplPtr()); + LastEventImpl->setStateIncomplete(); + LastEventImpl->setSubmissionTime(); EnqueueKernel(); - NewEvent->setEnqueued(); + LastEventImpl->setEnqueued(); // connect returned event with dependent events if (!MQueue->isInOrder()) { - NewEvent->getPreparedDepsEvents() = impl->CGData.MEvents; - NewEvent->cleanDepEventsThroughOneLevel(); + LastEventImpl->getPreparedDepsEvents() = impl->CGData.MEvents; + LastEventImpl->cleanDepEventsThroughOneLevel(); } } return MLastEvent;