From 2e3ea79b059829a2238640a32a42ef3029da4f91 Mon Sep 17 00:00:00 2001 From: "Larsen, Steffen" Date: Sun, 6 Jul 2025 23:33:17 -0700 Subject: [PATCH] [SYCL] Fix link() duplicate image detection The current implementation of link() only properly filters duplicates of the device_image_impl objects, but compiling the same device binary image twice may have yielded image impls that do not compare equal. Instead, we can compare the underlying binary images and only add owners once. Signed-off-by: Larsen, Steffen --- sycl/source/detail/kernel_bundle_impl.hpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sycl/source/detail/kernel_bundle_impl.hpp b/sycl/source/detail/kernel_bundle_impl.hpp index 0d144ac47a18d..8d0ab17cc331e 100644 --- a/sycl/source/detail/kernel_bundle_impl.hpp +++ b/sycl/source/detail/kernel_bundle_impl.hpp @@ -275,13 +275,24 @@ class kernel_bundle_impl std::vector DevImages; { std::set> DevImagesSet; + std::unordered_set SeenBinImgs; for (const kernel_bundle &ObjectBundle : - ObjectBundles) + ObjectBundles) { for (const device_image_plain &DevImg : - getSyclObjImpl(ObjectBundle)->MUniqueDeviceImages) - if (ImagesWithSpecConstsSet.find(getSyclObjImpl(DevImg)) == - ImagesWithSpecConstsSet.end()) - DevImagesSet.insert(getSyclObjImpl(DevImg)); + getSyclObjImpl(ObjectBundle)->MUniqueDeviceImages) { + auto &DevImgImpl = getSyclObjImpl(DevImg); + const RTDeviceBinaryImage *BinImg = DevImgImpl->get_bin_image_ref(); + // We have duplicate images if either the underlying binary image has + // been seen before or the device image implementation is in the + // image set already. + if ((BinImg && SeenBinImgs.find(BinImg) != SeenBinImgs.end()) || + ImagesWithSpecConstsSet.find(DevImgImpl) != + ImagesWithSpecConstsSet.end()) + continue; + SeenBinImgs.insert(BinImg); + DevImagesSet.insert(DevImgImpl); + } + } DevImages.reserve(DevImagesSet.size()); for (auto It = DevImagesSet.begin(); It != DevImagesSet.end();) DevImages.push_back(createSyclObjFromImpl(