From 77dfc4da09a0b4e246fa57a389ce9e08acc5c1b5 Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Wed, 8 Sep 2021 16:39:49 +0300 Subject: [PATCH 01/10] [SYCL] Hide SYCL service kernels The SYCL runtime may in places benefit from being able to define "service kernels" to use behind-the-scenes work on devices. These kernels may use the same interface as other SYCL kernels, but as such will be handled no different than user-defined kernels. These changes makes a distinction between service kernels and user-defined kernels by placing service kernels in a common namespace (`cl::sycl::detail::__sycl_service_kernel__`). The program manager will not grant unique kernel IDs to service kernels. This prevents service kernels from being visible to the user through kernel_bundle related interfaces. Consequently the runtime may create device images that do not contain any kernel IDs. As such, `sycl::has_kernel_bundle` will now discount any device images that have no kernel IDs. Signed-off-by: Steffen Larsen --- .../CL/sycl/detail/service_kernel_names.hpp | 21 ++++++++++++ sycl/include/CL/sycl/queue.hpp | 6 ++-- .../program_manager/program_manager.cpp | 20 ++++++++++++ sycl/source/kernel_bundle.cpp | 9 +++++- sycl/unittests/SYCL2020/KernelID.cpp | 32 ++++++++++++++++++- sycl/unittests/assert/assert.cpp | 23 ++++++++++--- 6 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 sycl/include/CL/sycl/detail/service_kernel_names.hpp diff --git a/sycl/include/CL/sycl/detail/service_kernel_names.hpp b/sycl/include/CL/sycl/detail/service_kernel_names.hpp new file mode 100644 index 0000000000000..34da77bf9398d --- /dev/null +++ b/sycl/include/CL/sycl/detail/service_kernel_names.hpp @@ -0,0 +1,21 @@ +//==-------- service_kernels.hpp - SYCL service kernel name types ----------==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#pragma once + +__SYCL_INLINE_NAMESPACE(cl) { +namespace sycl { +namespace detail { +namespace __sycl_service_kernel__ { + +class AssertInfoCopier; + +} // __sycl_service_kernel__ +} // namespace detail +} // namespace sycl +} // __SYCL_INLINE_NAMESPACE(cl) diff --git a/sycl/include/CL/sycl/queue.hpp b/sycl/include/CL/sycl/queue.hpp index 01f6cbc99015e..11db9e697a82c 100644 --- a/sycl/include/CL/sycl/queue.hpp +++ b/sycl/include/CL/sycl/queue.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -79,11 +80,10 @@ class queue; namespace detail { class queue_impl; #if __SYCL_USE_FALLBACK_ASSERT -class AssertInfoCopier; static event submitAssertCapture(queue &, event &, queue *, const detail::code_location &); #endif -} +} // namespace detail /// Encapsulates a single SYCL queue which schedules kernels on a SYCL device. /// @@ -1167,7 +1167,7 @@ event submitAssertCapture(queue &Self, event &Event, queue *SecondaryQueue, auto Acc = Buffer.get_access(CGH); - CGH.single_task([Acc] { + CGH.single_task<__sycl_service_kernel__::AssertInfoCopier>([Acc] { #ifdef __SYCL_DEVICE_ONLY__ __devicelib_assert_read(&Acc[0]); #else diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index b916039bda9ee..6cc4628c7cecb 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -64,6 +64,16 @@ ProgramManager &ProgramManager::getInstance() { return GlobalHandler::instance().getProgramManager(); } +// This function allows for identifying "service" kernels. A SYCL service kernel +// is a kernel that has not been defined by the user but is instead generated by +// the SYCL runtime. These are identified by being in the +// sycl::detail::__sycl_service_kernel__ namespace and are not given a unique +// kernel identifier and are not reported as part of kernel bundles. +static bool isServiceKernel(std::string KernelName) { + return KernelName.rfind("_ZTSN2cl4sycl6detail23__sycl_service_kernel__", 0) != + std::string::npos; +} + static RT::PiProgram createBinaryProgram(const ContextImplPtr Context, const device &Device, const unsigned char *Data, size_t DataLen, @@ -1044,6 +1054,11 @@ void ProgramManager::addImages(pi_device_binaries DeviceBinary) { auto Result = KSIdMap.insert(std::make_pair(EntriesIt->name, KSId)); (void)Result; assert(Result.second && "Kernel sets are not disjoint"); + + // Skip creating unique kernel ID if it is a service kernel + if (isServiceKernel(EntriesIt->name)) + continue; + // ... and create a unique kernel ID for the entry std::shared_ptr KernelIDImpl = std::make_shared(EntriesIt->name); @@ -1333,6 +1348,11 @@ ProgramManager::getSYCLDeviceImagesWithCompatibleState( for (_pi_offload_entry EntriesIt = DevBin->EntriesBegin; EntriesIt != DevBin->EntriesEnd; ++EntriesIt) { auto KernelID = m_KernelIDs.find(EntriesIt->name); + + // Service kernels do not have kernel IDs + if (KernelID == m_KernelIDs.end() && isServiceKernel(EntriesIt->name)) + continue; + assert(KernelID != m_KernelIDs.end() && "Kernel ID in device binary missing from cache"); KernelIDs.push_back(KernelID->second); diff --git a/sycl/source/kernel_bundle.cpp b/sycl/source/kernel_bundle.cpp index 3d162b3eb3325..e453e365a569d 100644 --- a/sycl/source/kernel_bundle.cpp +++ b/sycl/source/kernel_bundle.cpp @@ -167,7 +167,14 @@ bool has_kernel_bundle_impl(const context &Ctx, const std::vector &Devs, // TODO: Add a check that all kernel ids are compatible with at least one // device in Devs - return (bool)DeviceImages.size(); + // Some device images may have service kernels that do not have kernel IDs. + // A kernel bundle must have at least one kernel, excluding service kernels. + return std::any_of( + DeviceImages.begin(), DeviceImages.end(), + [](device_image_plain DeviceImage) { + return detail::getSyclObjImpl(DeviceImage)->get_kernel_ids().size() != + 0; + }); } bool has_kernel_bundle_impl(const context &Ctx, const std::vector &Devs, diff --git a/sycl/unittests/SYCL2020/KernelID.cpp b/sycl/unittests/SYCL2020/KernelID.cpp index fc4d34f99ac3e..baf3ef4bc7796 100644 --- a/sycl/unittests/SYCL2020/KernelID.cpp +++ b/sycl/unittests/SYCL2020/KernelID.cpp @@ -17,6 +17,7 @@ class TestKernel1; class TestKernel2; class TestKernel3; +class ServiceKernel1; __SYCL_INLINE_NAMESPACE(cl) { namespace sycl { @@ -57,6 +58,19 @@ template <> struct KernelInfo { static constexpr bool callsAnyThisFreeFunction() { return false; } }; +template <> struct KernelInfo { + static constexpr unsigned getNumParams() { return 0; } + static const kernel_param_desc_t &getParamDesc(int) { + static kernel_param_desc_t Dummy; + return Dummy; + } + static constexpr const char *getName() { + return "_ZTSN2cl4sycl6detail23__sycl_service_kernel__14ServiceKernel1"; + } + static constexpr bool isESIMD() { return false; } + static constexpr bool callsThisItem() { return false; } + static constexpr bool callsAnyThisFreeFunction() { return false; } +}; } // namespace detail } // namespace sycl } // __SYCL_INLINE_NAMESPACE(cl) @@ -84,7 +98,9 @@ generateDefaultImage(std::initializer_list Kernels) { static sycl::unittest::PiImage Imgs[2] = { generateDefaultImage({"KernelID_TestKernel1", "KernelID_TestKernel3"}), - generateDefaultImage({"KernelID_TestKernel2"})}; + generateDefaultImage( + {"KernelID_TestKernel2", + "_ZTSN2cl4sycl6detail23__sycl_service_kernel__14ServiceKernel1"})}; static sycl::unittest::PiImageArray<2> ImgArray{Imgs}; TEST(KernelID, AllProgramKernelIds) { @@ -106,6 +122,20 @@ TEST(KernelID, AllProgramKernelIds) { } } +TEST(KernelID, NoServiceKernelIds) { + const char *ServiceKernel1Name = + sycl::detail::KernelInfo::getName(); + + std::vector AllKernelIDs = sycl::get_kernel_ids(); + + auto NoFoundServiceKernelID = std::none_of( + AllKernelIDs.begin(), AllKernelIDs.end(), [=](sycl::kernel_id KernelID) { + return strcmp(KernelID.get_name(), ServiceKernel1Name) == 0; + }); + + EXPECT_TRUE(NoFoundServiceKernelID); +} + TEST(KernelID, FreeKernelIDEqualsKernelBundleId) { sycl::platform Plt{sycl::default_selector()}; if (Plt.is_host()) { diff --git a/sycl/unittests/assert/assert.cpp b/sycl/unittests/assert/assert.cpp index 4d583d7588610..b2f0e3acdc934 100644 --- a/sycl/unittests/assert/assert.cpp +++ b/sycl/unittests/assert/assert.cpp @@ -51,9 +51,10 @@ template <> struct KernelInfo { static constexpr const kernel_param_desc_t Signatures[] = { {kernel_param_kind_t::kind_accessor, 4062, 0}}; -template <> struct KernelInfo<::sycl::detail::AssertInfoCopier> { +template <> +struct KernelInfo<::sycl::detail::__sycl_service_kernel__::AssertInfoCopier> { static constexpr const char *getName() { - return "_ZTSN2cl4sycl6detail16AssertInfoCopierE"; + return "_ZTSN2cl4sycl6detail23__sycl_service_kernel__16AssertInfoCopierE"; } static constexpr unsigned getNumParams() { return 1; } static constexpr const kernel_param_desc_t &getParamDesc(unsigned Idx) { @@ -73,7 +74,7 @@ static sycl::unittest::PiImage generateDefaultImage() { static const std::string KernelName = "TestKernel"; static const std::string CopierKernelName = - "_ZTSN2cl4sycl6detail16AssertInfoCopierE"; + "_ZTSN2cl4sycl6detail23__sycl_service_kernel__16AssertInfoCopierE"; PiPropertySet PropSet; @@ -98,7 +99,7 @@ static sycl::unittest::PiImage generateCopierKernelImage() { using namespace sycl::unittest; static const std::string CopierKernelName = - "_ZTSN2cl4sycl6detail16AssertInfoCopierE"; + "_ZTSN2cl4sycl6detail23__sycl_service_kernel__16AssertInfoCopierE"; PiPropertySet PropSet; @@ -391,3 +392,17 @@ TEST(Assert, TestPositive) { } #endif // _WIN32 } + +TEST(Assert, TestAssertServiceKernelHidden) { + const char *AssertServiceKernelName = sycl::detail::KernelInfo< + sycl::detail::__sycl_service_kernel__::AssertInfoCopier>::getName(); + + std::vector AllKernelIDs = sycl::get_kernel_ids(); + + auto NoFoundServiceKernelID = std::none_of( + AllKernelIDs.begin(), AllKernelIDs.end(), [=](sycl::kernel_id KernelID) { + return strcmp(KernelID.get_name(), AssertServiceKernelName) == 0; + }); + + EXPECT_TRUE(NoFoundServiceKernelID); +} From e882a6d5d73717983f98b556d0515ab38c6b6095 Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Wed, 8 Sep 2021 17:15:12 +0300 Subject: [PATCH 02/10] Fix formatting Signed-off-by: Steffen Larsen --- sycl/include/CL/sycl/detail/service_kernel_names.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/include/CL/sycl/detail/service_kernel_names.hpp b/sycl/include/CL/sycl/detail/service_kernel_names.hpp index 34da77bf9398d..86a5defeae8c4 100644 --- a/sycl/include/CL/sycl/detail/service_kernel_names.hpp +++ b/sycl/include/CL/sycl/detail/service_kernel_names.hpp @@ -15,7 +15,7 @@ namespace __sycl_service_kernel__ { class AssertInfoCopier; -} // __sycl_service_kernel__ +} // namespace __sycl_service_kernel__ } // namespace detail } // namespace sycl } // __SYCL_INLINE_NAMESPACE(cl) From dbccdf1b94808b5ff45a06a438b438bba945b79c Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Wed, 8 Sep 2021 17:49:44 +0300 Subject: [PATCH 03/10] Loosen isServiceKernel check Signed-off-by: Steffen Larsen --- .../detail/program_manager/program_manager.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 6cc4628c7cecb..cfdb11a8e3ce9 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -66,12 +66,12 @@ ProgramManager &ProgramManager::getInstance() { // This function allows for identifying "service" kernels. A SYCL service kernel // is a kernel that has not been defined by the user but is instead generated by -// the SYCL runtime. These are identified by being in the -// sycl::detail::__sycl_service_kernel__ namespace and are not given a unique -// kernel identifier and are not reported as part of kernel bundles. -static bool isServiceKernel(std::string KernelName) { - return KernelName.rfind("_ZTSN2cl4sycl6detail23__sycl_service_kernel__", 0) != - std::string::npos; +// the SYCL runtime. Service kernel name types must be declared in the +// sycl::detail::__sycl_service_kernel__ namespace which is exclusively used for +// this purpose. As such service kernels can be identified by +// __sycl_service_kernel__ appearing in the mangled kernel name. +static bool isServiceKernel(const std::string KernelName) { + return KernelName.find("__sycl_service_kernel__") != std::string::npos; } static RT::PiProgram From 82b34e406607e688c1bf6e6bff1df64a34adf5fc Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Wed, 8 Sep 2021 17:51:55 +0300 Subject: [PATCH 04/10] Make isServiceKernel parameter const reference Signed-off-by: Steffen Larsen --- sycl/source/detail/program_manager/program_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index cfdb11a8e3ce9..8c07770082c5e 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -70,7 +70,7 @@ ProgramManager &ProgramManager::getInstance() { // sycl::detail::__sycl_service_kernel__ namespace which is exclusively used for // this purpose. As such service kernels can be identified by // __sycl_service_kernel__ appearing in the mangled kernel name. -static bool isServiceKernel(const std::string KernelName) { +static bool isServiceKernel(const std::string &KernelName) { return KernelName.find("__sycl_service_kernel__") != std::string::npos; } From 83b632128a41c68113dc63bfb121f7e74eb82783 Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Thu, 9 Sep 2021 17:48:37 +0300 Subject: [PATCH 05/10] Limit service-kernel check to missing kernel ids Signed-off-by: Steffen Larsen --- sycl/source/detail/program_manager/program_manager.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 8c07770082c5e..136133db01717 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -1349,12 +1349,13 @@ ProgramManager::getSYCLDeviceImagesWithCompatibleState( EntriesIt != DevBin->EntriesEnd; ++EntriesIt) { auto KernelID = m_KernelIDs.find(EntriesIt->name); - // Service kernels do not have kernel IDs - if (KernelID == m_KernelIDs.end() && isServiceKernel(EntriesIt->name)) + if (KernelID == m_KernelIDs.end()) { + // Service kernels do not have kernel IDs + assert(isServiceKernel(EntriesIt->name) && + "Kernel ID in device binary missing from cache"); continue; + } - assert(KernelID != m_KernelIDs.end() && - "Kernel ID in device binary missing from cache"); KernelIDs.push_back(KernelID->second); } } From 25411f5bd8d1e44cbfd85f3771ea78174e50fde5 Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Thu, 9 Sep 2021 17:57:05 +0300 Subject: [PATCH 06/10] Prevent creating device images without non-service kernels Signed-off-by: Steffen Larsen --- sycl/source/detail/program_manager/program_manager.cpp | 5 +++++ sycl/source/kernel_bundle.cpp | 9 +-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 136133db01717..9e114ee0bd71c 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -1359,6 +1359,11 @@ ProgramManager::getSYCLDeviceImagesWithCompatibleState( KernelIDs.push_back(KernelID->second); } } + + // If the image does not contain any non-service kernels we can skip it. + if (KernelIDs.empty()) + continue; + // device_image_impl expects kernel ids to be sorted for fast search std::sort(KernelIDs.begin(), KernelIDs.end(), LessByNameComp{}); diff --git a/sycl/source/kernel_bundle.cpp b/sycl/source/kernel_bundle.cpp index e453e365a569d..3d162b3eb3325 100644 --- a/sycl/source/kernel_bundle.cpp +++ b/sycl/source/kernel_bundle.cpp @@ -167,14 +167,7 @@ bool has_kernel_bundle_impl(const context &Ctx, const std::vector &Devs, // TODO: Add a check that all kernel ids are compatible with at least one // device in Devs - // Some device images may have service kernels that do not have kernel IDs. - // A kernel bundle must have at least one kernel, excluding service kernels. - return std::any_of( - DeviceImages.begin(), DeviceImages.end(), - [](device_image_plain DeviceImage) { - return detail::getSyclObjImpl(DeviceImage)->get_kernel_ids().size() != - 0; - }); + return (bool)DeviceImages.size(); } bool has_kernel_bundle_impl(const context &Ctx, const std::vector &Devs, From b78f7af8d98aa2e0f2ec8982d57c6752050662f5 Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Fri, 10 Sep 2021 11:18:59 +0300 Subject: [PATCH 07/10] Cache found service kernels Signed-off-by: Steffen Larsen --- .../program_manager/program_manager.cpp | 22 ++++++++----------- .../program_manager/program_manager.hpp | 8 +++++++ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 9e114ee0bd71c..768673dd82012 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -64,16 +64,6 @@ ProgramManager &ProgramManager::getInstance() { return GlobalHandler::instance().getProgramManager(); } -// This function allows for identifying "service" kernels. A SYCL service kernel -// is a kernel that has not been defined by the user but is instead generated by -// the SYCL runtime. Service kernel name types must be declared in the -// sycl::detail::__sycl_service_kernel__ namespace which is exclusively used for -// this purpose. As such service kernels can be identified by -// __sycl_service_kernel__ appearing in the mangled kernel name. -static bool isServiceKernel(const std::string &KernelName) { - return KernelName.find("__sycl_service_kernel__") != std::string::npos; -} - static RT::PiProgram createBinaryProgram(const ContextImplPtr Context, const device &Device, const unsigned char *Data, size_t DataLen, @@ -1055,9 +1045,14 @@ void ProgramManager::addImages(pi_device_binaries DeviceBinary) { (void)Result; assert(Result.second && "Kernel sets are not disjoint"); - // Skip creating unique kernel ID if it is a service kernel - if (isServiceKernel(EntriesIt->name)) + // Skip creating unique kernel ID if it is a service kernel. + // SYCL service kernels are identified by having + // __sycl_service_kernel__ in the mangled name, primarily as part of + // the namespace of the name type. + if (std::strstr(EntriesIt->name, "__sycl_service_kernel__")) { + m_ServiceKernels.insert(EntriesIt->name); continue; + } // ... and create a unique kernel ID for the entry std::shared_ptr KernelIDImpl = @@ -1351,7 +1346,8 @@ ProgramManager::getSYCLDeviceImagesWithCompatibleState( if (KernelID == m_KernelIDs.end()) { // Service kernels do not have kernel IDs - assert(isServiceKernel(EntriesIt->name) && + assert(m_ServiceKernels.find(EntriesIt->name) != + m_ServiceKernels.end() && "Kernel ID in device binary missing from cache"); continue; } diff --git a/sycl/source/detail/program_manager/program_manager.hpp b/sycl/source/detail/program_manager/program_manager.hpp index 04c7202499721..2ff50265580bb 100644 --- a/sycl/source/detail/program_manager/program_manager.hpp +++ b/sycl/source/detail/program_manager/program_manager.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include // +++ Entry points referenced by the offload wrapper object { @@ -284,6 +285,13 @@ class ProgramManager { /// \ref Sync::getGlobalLock() while holding this mutex. std::mutex m_KernelIDsMutex; + /// Caches all found service kernels to expedite future checks. A SYCL service + /// kernel is a kernel that has not been defined by the user but is instead + /// generated by the SYCL runtime. Service kernel name types must be declared + /// in the sycl::detail::__sycl_service_kernel__ namespace which is + /// exclusively used for this purpose. + std::unordered_set m_ServiceKernels; + // Keeps track of pi_program to image correspondence. Needed for: // - knowing which specialization constants are used in the program and // injecting their current values before compiling the SPIR-V; the binary From 5052d1a911bc1fc926a10777afe454fa284facec Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Fri, 10 Sep 2021 13:01:16 +0300 Subject: [PATCH 08/10] Add note about write-access limitation Signed-off-by: Steffen Larsen --- sycl/source/detail/program_manager/program_manager.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/sycl/source/detail/program_manager/program_manager.hpp b/sycl/source/detail/program_manager/program_manager.hpp index 2ff50265580bb..b8482b209808b 100644 --- a/sycl/source/detail/program_manager/program_manager.hpp +++ b/sycl/source/detail/program_manager/program_manager.hpp @@ -290,6 +290,7 @@ class ProgramManager { /// generated by the SYCL runtime. Service kernel name types must be declared /// in the sycl::detail::__sycl_service_kernel__ namespace which is /// exclusively used for this purpose. + /// Write access is only allowed during start-up (addImages). std::unordered_set m_ServiceKernels; // Keeps track of pi_program to image correspondence. Needed for: From 3bc70d48231dd7ddd8a02b42877d352a3bbfcf56 Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Fri, 10 Sep 2021 14:13:56 +0300 Subject: [PATCH 09/10] Change comment to require m_KernelIDsMutex Signed-off-by: Steffen Larsen --- sycl/source/detail/program_manager/program_manager.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sycl/source/detail/program_manager/program_manager.hpp b/sycl/source/detail/program_manager/program_manager.hpp index b8482b209808b..8fd1278d386b0 100644 --- a/sycl/source/detail/program_manager/program_manager.hpp +++ b/sycl/source/detail/program_manager/program_manager.hpp @@ -276,7 +276,7 @@ class ProgramManager { /// Maps names of kernels to their unique kernel IDs. /// TODO: Use std::unordered_set with transparent hash and equality functions /// when C++20 is enabled for the runtime library. - /// Access must be guarded by the m_KernelIDsMutex mutex + /// Access must be guarded by the m_KernelIDsMutex mutex. std::unordered_map m_KernelIDs; /// Protects kernel ID cache. @@ -290,7 +290,7 @@ class ProgramManager { /// generated by the SYCL runtime. Service kernel name types must be declared /// in the sycl::detail::__sycl_service_kernel__ namespace which is /// exclusively used for this purpose. - /// Write access is only allowed during start-up (addImages). + /// Access must be guarded by the m_KernelIDsMutex mutex. std::unordered_set m_ServiceKernels; // Keeps track of pi_program to image correspondence. Needed for: From f7c8f5e6bd3141eb3b1a18abacc80502c2f11b1c Mon Sep 17 00:00:00 2001 From: Steffen Larsen Date: Tue, 14 Sep 2021 19:44:00 +0300 Subject: [PATCH 10/10] Remove obsolete TODO comment Signed-off-by: Steffen Larsen --- sycl/source/detail/program_manager/program_manager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/sycl/source/detail/program_manager/program_manager.cpp b/sycl/source/detail/program_manager/program_manager.cpp index 768673dd82012..b9b05adb8eb2e 100644 --- a/sycl/source/detail/program_manager/program_manager.cpp +++ b/sycl/source/detail/program_manager/program_manager.cpp @@ -1333,7 +1333,6 @@ ProgramManager::getSYCLDeviceImagesWithCompatibleState( if (!compatibleWithDevice(BinImage, Dev)) continue; - // TODO: Cache kernel_ids std::vector KernelIDs; // Collect kernel names for the image pi_device_binary DevBin =