@@ -257,11 +257,11 @@ class device_image_impl
257257 device_image_impl (const RTDeviceBinaryImage *BinImage, context Context,
258258 devices_range Devices, bundle_state State,
259259 std::shared_ptr<std::vector<kernel_id>> KernelIDs,
260- ur_program_handle_t Program, uint8_t Origins, private_tag)
260+ Managed<ur_program_handle_t > &&Program, uint8_t Origins,
261+ private_tag)
261262 : MBinImage(BinImage), MContext(std::move(Context)),
262263 MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
263- MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
264- MKernelIDs(std::move(KernelIDs)),
264+ MProgram(std::move(Program)), MKernelIDs(std::move(KernelIDs)),
265265 MSpecConstsDefValBlob(getSpecConstsDefValBlob()), MOrigins(Origins) {
266266 updateSpecConstSymMap ();
267267 if (BinImage && (MOrigins & ImageOriginSYCLBIN)) {
@@ -287,40 +287,23 @@ class device_image_impl
287287 const RTDeviceBinaryImage *BinImage, const context &Context,
288288 devices_range Devices, bundle_state State,
289289 std::shared_ptr<std::vector<kernel_id>> KernelIDs,
290- ur_program_handle_t Program, const SpecConstMapT &SpecConstMap,
290+ Managed< ur_program_handle_t > && Program, const SpecConstMapT &SpecConstMap,
291291 const std::vector<unsigned char > &SpecConstsBlob, uint8_t Origins,
292292 std::optional<KernelCompilerBinaryInfo> &&RTCInfo,
293293 KernelNameSetT &&KernelNames,
294294 KernelNameToArgMaskMap &&EliminatedKernelArgMasks,
295295 std::unique_ptr<DynRTDeviceBinaryImage> &&MergedImageStorage, private_tag)
296296 : MBinImage(BinImage), MContext(std::move(Context)),
297297 MDevices(Devices.to<std::vector<device_impl *>>()), MState(State),
298- MProgram(Program, getSyclObjImpl(MContext)->getAdapter( )),
299- MKernelIDs(std::move(KernelIDs)), MKernelNames{std::move (KernelNames)},
298+ MProgram(std::move( Program)), MKernelIDs(std::move(KernelIDs )),
299+ MKernelNames{std::move (KernelNames)},
300300 MEliminatedKernelArgMasks{std::move (EliminatedKernelArgMasks)},
301301 MSpecConstsBlob (SpecConstsBlob),
302302 MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
303303 MSpecConstSymMap (SpecConstMap), MOrigins(Origins),
304304 MRTCBinInfo (std::move(RTCInfo)),
305305 MMergedImageStorage (std::move(MergedImageStorage)) {}
306306
307- device_image_impl (const RTDeviceBinaryImage *BinImage, const context &Context,
308- devices_range Devices, bundle_state State,
309- ur_program_handle_t Program, syclex::source_language Lang,
310- KernelNameSetT &&KernelNames,
311- KernelNameToArgMaskMap &&EliminatedKernelArgMasks,
312- private_tag)
313- : MBinImage(BinImage), MContext(std::move(Context)),
314- MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
315- MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
316- MKernelNames{std::move (KernelNames)},
317- MEliminatedKernelArgMasks{std::move (EliminatedKernelArgMasks)},
318- MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
319- MOrigins (ImageOriginKernelCompiler),
320- MRTCBinInfo (KernelCompilerBinaryInfo{Lang}) {
321- updateSpecConstSymMap ();
322- }
323-
324307 device_image_impl (
325308 const RTDeviceBinaryImage *BinImage, const context &Context,
326309 devices_range Devices, bundle_state State,
@@ -366,14 +349,13 @@ class device_image_impl
366349 }
367350
368351 device_image_impl (const context &Context, devices_range Devices,
369- bundle_state State, ur_program_handle_t Program,
352+ bundle_state State, Managed< ur_program_handle_t > && Program,
370353 syclex::source_language Lang, KernelNameSetT &&KernelNames,
371354 private_tag)
372355 : MBinImage(static_cast <const RTDeviceBinaryImage *>(nullptr )),
373356 MContext(std::move(Context)),
374357 MDevices(Devices.to<std::vector<device_impl *>>()), MState(State),
375- MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
376- MKernelNames{std::move (KernelNames)},
358+ MProgram(std::move(Program)), MKernelNames{std::move (KernelNames)},
377359 MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
378360 MOrigins(ImageOriginKernelCompiler),
379361 MRTCBinInfo(KernelCompilerBinaryInfo{Lang}) {}
@@ -771,14 +753,14 @@ class device_image_impl
771753
772754 auto DeviceVec = Devices.to <std::vector<ur_device_handle_t >>();
773755
774- ur_program_handle_t UrProgram = nullptr ;
756+ Managed< ur_program_handle_t > UrProgram;
775757 // SourceStrPtr will be null when source is Spir-V bytes.
776758 const std::string *SourceStrPtr = std::get_if<std::string>(&MBinImage);
777- bool FetchedFromCache = false ;
778759 if (PersistentDeviceCodeCache::isEnabled () && SourceStrPtr) {
779- FetchedFromCache = extKernelCompilerFetchFromCache (
780- Devices, BuildOptions, *SourceStrPtr, UrProgram );
760+ UrProgram =
761+ extKernelCompilerFetchFromCache ( Devices, BuildOptions, *SourceStrPtr);
781762 }
763+ bool FetchedFromCache = (UrProgram != nullptr );
782764
783765 adapter_impl &Adapter = ContextImpl.getAdapter ();
784766
@@ -813,7 +795,7 @@ class device_image_impl
813795 }
814796 return std::vector<std::shared_ptr<device_image_impl>>{
815797 device_image_impl::create (MContext, Devices, bundle_state::executable,
816- UrProgram, MRTCBinInfo->MLanguage ,
798+ std::move ( UrProgram) , MRTCBinInfo->MLanguage ,
817799 std::move (KernelNameSet))};
818800 }
819801
@@ -907,10 +889,10 @@ class device_image_impl
907889 return SS.str ();
908890 }
909891
910- bool extKernelCompilerFetchFromCache (
892+ Managed< ur_program_handle_t > extKernelCompilerFetchFromCache (
911893 devices_range Devices,
912894 const std::vector<sycl::detail::string_view> &BuildOptions,
913- const std::string &SourceStr, ur_program_handle_t &UrProgram ) const {
895+ const std::string &SourceStr) const {
914896 sycl::detail::context_impl &ContextImpl = *getSyclObjImpl (MContext);
915897 adapter_impl &Adapter = ContextImpl.getAdapter ();
916898
@@ -924,7 +906,7 @@ class device_image_impl
924906 PersistentDeviceCodeCache::getCompiledKernelFromDisc (Devices, UserArgs,
925907 SourceStr);
926908 if (BinProgs.empty ()) {
927- return false ;
909+ return {} ;
928910 }
929911 for (auto &BinProg : BinProgs) {
930912 Binaries.push_back ((uint8_t *)(BinProg.data ()));
@@ -937,11 +919,12 @@ class device_image_impl
937919 Properties.count = 0 ;
938920 Properties.pMetadatas = nullptr ;
939921
922+ Managed<ur_program_handle_t > UrProgram{Adapter};
940923 Adapter.call <UrApiKind::urProgramCreateWithBinary>(
941924 ContextImpl.getHandleRef (), DeviceHandles.size (), DeviceHandles.data (),
942925 Lengths.data (), Binaries.data (), &Properties, &UrProgram);
943926
944- return true ;
927+ return UrProgram ;
945928 }
946929
947930 // Get the specialization constant default value blob.
@@ -1226,7 +1209,7 @@ class device_image_impl
12261209 return Result;
12271210 }
12281211
1229- ur_program_handle_t
1212+ Managed< ur_program_handle_t >
12301213 createProgramFromSource (devices_range Devices,
12311214 const std::vector<sycl::detail::string_view> &Options,
12321215 std::string *LogPtr) const {
@@ -1266,11 +1249,10 @@ class device_image_impl
12661249 " languages at this time" );
12671250 }();
12681251
1269- ur_program_handle_t UrProgram = nullptr ;
1252+ Managed< ur_program_handle_t > UrProgram{Adapter} ;
12701253 Adapter.call <UrApiKind::urProgramCreateWithIL>(ContextImpl.getHandleRef (),
12711254 spirv.data (), spirv.size (),
12721255 nullptr , &UrProgram);
1273- // program created by urProgramCreateWithIL is implicitly retained.
12741256 if (UrProgram == nullptr )
12751257 throw sycl::exception (
12761258 sycl::make_error_code (errc::invalid),
0 commit comments