Skip to content

Commit a569e8c

Browse files
[SYCL] Fix link() duplicate image detection (#19319)
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 <steffen.larsen@intel.com>
1 parent 1be6e9c commit a569e8c

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

sycl/source/detail/kernel_bundle_impl.hpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,24 @@ class kernel_bundle_impl
275275
std::vector<device_image_plain> DevImages;
276276
{
277277
std::set<std::shared_ptr<device_image_impl>> DevImagesSet;
278+
std::unordered_set<const RTDeviceBinaryImage *> SeenBinImgs;
278279
for (const kernel_bundle<bundle_state::object> &ObjectBundle :
279-
ObjectBundles)
280+
ObjectBundles) {
280281
for (const device_image_plain &DevImg :
281-
getSyclObjImpl(ObjectBundle)->MUniqueDeviceImages)
282-
if (ImagesWithSpecConstsSet.find(getSyclObjImpl(DevImg)) ==
283-
ImagesWithSpecConstsSet.end())
284-
DevImagesSet.insert(getSyclObjImpl(DevImg));
282+
getSyclObjImpl(ObjectBundle)->MUniqueDeviceImages) {
283+
auto &DevImgImpl = getSyclObjImpl(DevImg);
284+
const RTDeviceBinaryImage *BinImg = DevImgImpl->get_bin_image_ref();
285+
// We have duplicate images if either the underlying binary image has
286+
// been seen before or the device image implementation is in the
287+
// image set already.
288+
if ((BinImg && SeenBinImgs.find(BinImg) != SeenBinImgs.end()) ||
289+
ImagesWithSpecConstsSet.find(DevImgImpl) !=
290+
ImagesWithSpecConstsSet.end())
291+
continue;
292+
SeenBinImgs.insert(BinImg);
293+
DevImagesSet.insert(DevImgImpl);
294+
}
295+
}
285296
DevImages.reserve(DevImagesSet.size());
286297
for (auto It = DevImagesSet.begin(); It != DevImagesSet.end();)
287298
DevImages.push_back(createSyclObjFromImpl<device_image_plain>(

0 commit comments

Comments
 (0)