From 7ca927a1d7742f10f7093e7480f08006bcab16ba Mon Sep 17 00:00:00 2001 From: Andrei Elovikov Date: Fri, 13 Jun 2025 10:34:05 -0700 Subject: [PATCH] [NFC][SYCL] Pass `context_impl` by raw ptr/ref in `kernel_impl.hpp` Part of the ongoing refactoring to prefer raw ptr/ref for SYCL RT objects by default with explicit `shared_from_this` when lifetimes need to be extended. --- sycl/source/backend.cpp | 2 +- sycl/source/detail/device_image_impl.hpp | 4 ++-- sycl/source/detail/kernel_bundle_impl.hpp | 2 +- sycl/source/detail/kernel_impl.cpp | 15 ++++++++------- sycl/source/detail/kernel_impl.hpp | 7 +++---- sycl/source/kernel.cpp | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/sycl/source/backend.cpp b/sycl/source/backend.cpp index 4ca320eecbd3a..ae523931aa7b2 100644 --- a/sycl/source/backend.cpp +++ b/sycl/source/backend.cpp @@ -360,7 +360,7 @@ kernel make_kernel(const context &TargetContext, // Construct the SYCL queue from UR queue. return detail::createSyclObjFromImpl( - std::make_shared(UrKernel, ContextImpl, KernelBundleImpl)); + std::make_shared(UrKernel, *ContextImpl, KernelBundleImpl)); } kernel make_kernel(ur_native_handle_t NativeHandle, diff --git a/sycl/source/detail/device_image_impl.hpp b/sycl/source/detail/device_image_impl.hpp index 83af5b246683a..0c8e9b8d97798 100644 --- a/sycl/source/detail/device_image_impl.hpp +++ b/sycl/source/detail/device_image_impl.hpp @@ -638,7 +638,7 @@ class device_image_impl { auto [UrKernel, CacheMutex, ArgMask] = PM.getOrCreateKernel(Context, AdjustedName, /*PropList=*/{}, UrProgram); - return std::make_shared(UrKernel, getSyclObjImpl(Context), + return std::make_shared(UrKernel, *getSyclObjImpl(Context), Self, OwnerBundle, ArgMask, UrProgram, CacheMutex); } @@ -653,7 +653,7 @@ class device_image_impl { // Kernel created by urKernelCreate is implicitly retained. return std::make_shared( - UrKernel, detail::getSyclObjImpl(Context), Self, OwnerBundle, + UrKernel, *detail::getSyclObjImpl(Context), Self, OwnerBundle, /*ArgMask=*/nullptr, UrProgram, /*CacheMutex=*/nullptr); } diff --git a/sycl/source/detail/kernel_bundle_impl.hpp b/sycl/source/detail/kernel_bundle_impl.hpp index ec7ff702ee8ac..8bb2df1ac7e20 100644 --- a/sycl/source/detail/kernel_bundle_impl.hpp +++ b/sycl/source/detail/kernel_bundle_impl.hpp @@ -938,7 +938,7 @@ class kernel_bundle_impl { SelectedImage->get_ur_program_ref()); return std::make_shared( - Kernel, detail::getSyclObjImpl(MContext), SelectedImage, Self, ArgMask, + Kernel, *detail::getSyclObjImpl(MContext), SelectedImage, Self, ArgMask, SelectedImage->get_ur_program_ref(), CacheMutex); } diff --git a/sycl/source/detail/kernel_impl.cpp b/sycl/source/detail/kernel_impl.cpp index 8b02811b287e4..d5197a238c0d8 100644 --- a/sycl/source/detail/kernel_impl.cpp +++ b/sycl/source/detail/kernel_impl.cpp @@ -16,19 +16,19 @@ namespace sycl { inline namespace _V1 { namespace detail { -kernel_impl::kernel_impl(ur_kernel_handle_t Kernel, ContextImplPtr Context, +kernel_impl::kernel_impl(ur_kernel_handle_t Kernel, context_impl &Context, KernelBundleImplPtr KernelBundleImpl, const KernelArgMask *ArgMask) - : MKernel(Kernel), MContext(Context), - MProgram(ProgramManager::getInstance().getUrProgramFromUrKernel( - Kernel, *Context)), + : MKernel(Kernel), MContext(Context.shared_from_this()), + MProgram(ProgramManager::getInstance().getUrProgramFromUrKernel(Kernel, + Context)), MCreatedFromSource(true), MKernelBundleImpl(std::move(KernelBundleImpl)), MIsInterop(true), MKernelArgMaskPtr{ArgMask} { ur_context_handle_t UrContext = nullptr; // Using the adapter from the passed ContextImpl getAdapter()->call( MKernel, UR_KERNEL_INFO_CONTEXT, sizeof(UrContext), &UrContext, nullptr); - if (Context->getHandleRef() != UrContext) + if (Context.getHandleRef() != UrContext) throw sycl::exception( make_error_code(errc::invalid), "Input context must be the same as the context of cl_kernel"); @@ -37,12 +37,13 @@ kernel_impl::kernel_impl(ur_kernel_handle_t Kernel, ContextImplPtr Context, enableUSMIndirectAccess(); } -kernel_impl::kernel_impl(ur_kernel_handle_t Kernel, ContextImplPtr ContextImpl, +kernel_impl::kernel_impl(ur_kernel_handle_t Kernel, context_impl &ContextImpl, DeviceImageImplPtr DeviceImageImpl, KernelBundleImplPtr KernelBundleImpl, const KernelArgMask *ArgMask, ur_program_handle_t Program, std::mutex *CacheMutex) - : MKernel(Kernel), MContext(std::move(ContextImpl)), MProgram(Program), + : MKernel(Kernel), MContext(ContextImpl.shared_from_this()), + MProgram(Program), MCreatedFromSource(DeviceImageImpl->isNonSYCLSourceBased()), MDeviceImageImpl(std::move(DeviceImageImpl)), MKernelBundleImpl(std::move(KernelBundleImpl)), diff --git a/sycl/source/detail/kernel_impl.hpp b/sycl/source/detail/kernel_impl.hpp index 30d2eaa517792..3dc45ae8e8602 100644 --- a/sycl/source/detail/kernel_impl.hpp +++ b/sycl/source/detail/kernel_impl.hpp @@ -28,7 +28,6 @@ namespace detail { // Forward declaration class kernel_bundle_impl; -using ContextImplPtr = std::shared_ptr; using KernelBundleImplPtr = std::shared_ptr; class kernel_impl { public: @@ -40,7 +39,7 @@ class kernel_impl { /// \param Kernel is a valid UrKernel instance /// \param Context is a valid SYCL context /// \param KernelBundleImpl is a valid instance of kernel_bundle_impl - kernel_impl(ur_kernel_handle_t Kernel, ContextImplPtr Context, + kernel_impl(ur_kernel_handle_t Kernel, context_impl &Context, KernelBundleImplPtr KernelBundleImpl, const KernelArgMask *ArgMask = nullptr); @@ -50,7 +49,7 @@ class kernel_impl { /// \param Kernel is a valid UrKernel instance /// \param ContextImpl is a valid SYCL context /// \param KernelBundleImpl is a valid instance of kernel_bundle_impl - kernel_impl(ur_kernel_handle_t Kernel, ContextImplPtr ContextImpl, + kernel_impl(ur_kernel_handle_t Kernel, context_impl &ContextImpl, DeviceImageImplPtr DeviceImageImpl, KernelBundleImplPtr KernelBundleImpl, const KernelArgMask *ArgMask, ur_program_handle_t Program, @@ -245,7 +244,7 @@ class kernel_impl { private: ur_kernel_handle_t MKernel = nullptr; - const ContextImplPtr MContext; + const std::shared_ptr MContext; const ur_program_handle_t MProgram = nullptr; bool MCreatedFromSource = true; const DeviceImageImplPtr MDeviceImageImpl; diff --git a/sycl/source/kernel.cpp b/sycl/source/kernel.cpp index 8d743b643feb5..fd008384cc7d7 100644 --- a/sycl/source/kernel.cpp +++ b/sycl/source/kernel.cpp @@ -27,7 +27,7 @@ kernel::kernel(cl_kernel ClKernel, const context &SyclContext) { nativeHandle, detail::getSyclObjImpl(SyclContext)->getHandleRef(), nullptr, nullptr, &hKernel); impl = std::make_shared( - hKernel, detail::getSyclObjImpl(SyclContext), nullptr, nullptr); + hKernel, *detail::getSyclObjImpl(SyclContext), nullptr, nullptr); // This is a special interop constructor for OpenCL, so the kernel must be // retained. if (get_backend() == backend::opencl) {