@@ -260,7 +260,8 @@ class device_image_impl
260260 ur_program_handle_t Program, uint8_t Origins, private_tag)
261261 : MBinImage(BinImage), MContext(std::move(Context)),
262262 MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
263- MProgram(Program), MKernelIDs(std::move(KernelIDs)),
263+ MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
264+ MKernelIDs(std::move(KernelIDs)),
264265 MSpecConstsDefValBlob(getSpecConstsDefValBlob()), MOrigins(Origins) {
265266 updateSpecConstSymMap ();
266267 if (BinImage && (MOrigins & ImageOriginSYCLBIN)) {
@@ -294,8 +295,8 @@ class device_image_impl
294295 std::unique_ptr<DynRTDeviceBinaryImage> &&MergedImageStorage, private_tag)
295296 : MBinImage(BinImage), MContext(std::move(Context)),
296297 MDevices(Devices.to<std::vector<device_impl *>>()), MState(State),
297- MProgram(Program), MKernelIDs(std::move(KernelIDs )),
298- MKernelNames{std::move (KernelNames)},
298+ MProgram(Program, getSyclObjImpl(MContext)->getAdapter( )),
299+ MKernelIDs(std::move(KernelIDs)), MKernelNames{std::move (KernelNames)},
299300 MEliminatedKernelArgMasks{std::move (EliminatedKernelArgMasks)},
300301 MSpecConstsBlob (SpecConstsBlob),
301302 MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
@@ -311,7 +312,8 @@ class device_image_impl
311312 private_tag)
312313 : MBinImage(BinImage), MContext(std::move(Context)),
313314 MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
314- MProgram(Program), MKernelNames{std::move (KernelNames)},
315+ MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
316+ MKernelNames{std::move (KernelNames)},
315317 MEliminatedKernelArgMasks{std::move (EliminatedKernelArgMasks)},
316318 MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
317319 MOrigins (ImageOriginKernelCompiler),
@@ -329,8 +331,7 @@ class device_image_impl
329331 private_tag)
330332 : MBinImage(BinImage), MContext(std::move(Context)),
331333 MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
332- MProgram(nullptr ), MKernelIDs(std::move(KernelIDs)),
333- MKernelNames{std::move (KernelNames)},
334+ MKernelIDs(std::move(KernelIDs)), MKernelNames{std::move (KernelNames)},
334335 MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
335336 MOrigins(ImageOriginKernelCompiler),
336337 MRTCBinInfo(KernelCompilerBinaryInfo{
@@ -344,7 +345,7 @@ class device_image_impl
344345 include_pairs_t &&IncludePairsVec, private_tag)
345346 : MBinImage(Src), MContext(std::move(Context)),
346347 MDevices(Devices.to<std::vector<device_impl *>>()),
347- MState(bundle_state::ext_oneapi_source), MProgram( nullptr ),
348+ MState(bundle_state::ext_oneapi_source),
348349 MSpecConstsDefValBlob(getSpecConstsDefValBlob()),
349350 MOrigins(ImageOriginKernelCompiler),
350351 MRTCBinInfo(
@@ -357,7 +358,7 @@ class device_image_impl
357358 private_tag)
358359 : MBinImage(Bytes), MContext(std::move(Context)),
359360 MDevices(Devices.to<std::vector<device_impl *>>()),
360- MState(bundle_state::ext_oneapi_source), MProgram( nullptr ),
361+ MState(bundle_state::ext_oneapi_source),
361362 MSpecConstsDefValBlob(getSpecConstsDefValBlob()),
362363 MOrigins(ImageOriginKernelCompiler),
363364 MRTCBinInfo(KernelCompilerBinaryInfo{Lang}) {
@@ -371,7 +372,8 @@ class device_image_impl
371372 : MBinImage(static_cast <const RTDeviceBinaryImage *>(nullptr )),
372373 MContext(std::move(Context)),
373374 MDevices(Devices.to<std::vector<device_impl *>>()), MState(State),
374- MProgram(Program), MKernelNames{std::move (KernelNames)},
375+ MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
376+ MKernelNames{std::move (KernelNames)},
375377 MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
376378 MOrigins(ImageOriginKernelCompiler),
377379 MRTCBinInfo(KernelCompilerBinaryInfo{Lang}) {}
@@ -558,9 +560,7 @@ class device_image_impl
558560 return get_devices ().contains (Dev);
559561 }
560562
561- const ur_program_handle_t &get_ur_program_ref () const noexcept {
562- return MProgram;
563- }
563+ ur_program_handle_t get_ur_program () const noexcept { return MProgram; }
564564
565565 const RTDeviceBinaryImage *const &get_bin_image_ref () const {
566566 return std::get<const RTDeviceBinaryImage *>(MBinImage);
@@ -617,21 +617,25 @@ class device_image_impl
617617 return NativeProgram;
618618 }
619619
620- ~device_image_impl () {
621- try {
622- if (MProgram) {
623- adapter_impl &Adapter = getSyclObjImpl (MContext)->getAdapter ();
624- Adapter.call <UrApiKind::urProgramRelease>(MProgram);
625- }
626- if (MSpecConstsBuffer) {
627- std::lock_guard<std::mutex> Lock{MSpecConstAccessMtx};
628- adapter_impl &Adapter = getSyclObjImpl (MContext)->getAdapter ();
629- memReleaseHelper (Adapter, MSpecConstsBuffer);
630- }
631- } catch (std::exception &e) {
632- __SYCL_REPORT_EXCEPTION_TO_STREAM (" exception in ~device_image_impl" , e);
620+ #ifdef _MSC_VER
621+ #pragma warning(push)
622+ // https://developercommunity.visualstudio.com/t/False-C4297-warning-while-using-function/1130300
623+ // https://godbolt.org/z/xsMvKf84f
624+ #pragma warning(disable : 4297)
625+ #endif
626+ ~device_image_impl () try {
627+ if (MSpecConstsBuffer) {
628+ std::lock_guard<std::mutex> Lock{MSpecConstAccessMtx};
629+ adapter_impl &Adapter = getSyclObjImpl (MContext)->getAdapter ();
630+ memReleaseHelper (Adapter, MSpecConstsBuffer);
633631 }
632+ } catch (std::exception &e) {
633+ __SYCL_REPORT_EXCEPTION_TO_STREAM (" exception in ~device_image_impl" , e);
634+ return ; // Don't re-throw.
634635 }
636+ #ifdef _MSC_VER
637+ #pragma warning(pop)
638+ #endif
635639
636640 std::string adjustKernelName (std::string_view Name) const {
637641 if (MOrigins & ImageOriginSYCLBIN) {
@@ -1298,7 +1302,7 @@ class device_image_impl
12981302 std::vector<device_impl *> MDevices;
12991303 bundle_state MState;
13001304 // Native program handler which this device image represents
1301- ur_program_handle_t MProgram = nullptr ;
1305+ Managed< ur_program_handle_t > MProgram;
13021306
13031307 // List of kernel ids available in this image, elements should be sorted
13041308 // according to LessByNameComp. Shared between images for performance reasons
0 commit comments