Skip to content

Commit 8955813

Browse files
authored
[SYCL] Fix ProgramManager::kernelUsesAssert to avoid tmp string creation (#17912)
The handler calls the `ProgramManager::kernelUsesAssert` with `const char *` argument. It resulted in a temporary `std::string` creation. This PR changes the `ProgramManager::kernelUsesAssert` to accept template parameter and uses heterogeneous lookup feature of `std::set`
1 parent b6f383b commit 8955813

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

sycl/source/detail/program_manager/program_manager.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,10 +1824,6 @@ void ProgramManager::cacheKernelUsesAssertInfo(RTDeviceBinaryImage &Img) {
18241824
m_KernelUsesAssert.insert(Prop->Name);
18251825
}
18261826

1827-
bool ProgramManager::kernelUsesAssert(const std::string &KernelName) const {
1828-
return m_KernelUsesAssert.find(KernelName) != m_KernelUsesAssert.end();
1829-
}
1830-
18311827
void ProgramManager::cacheKernelImplicitLocalArg(RTDeviceBinaryImage &Img) {
18321828
const RTDeviceBinaryImage::PropertyRange &ImplicitLocalArgRange =
18331829
Img.getImplicitLocalArg();

sycl/source/detail/program_manager/program_manager.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,10 @@ class ProgramManager {
360360
ProgramManager();
361361
~ProgramManager() = default;
362362

363-
bool kernelUsesAssert(const std::string &KernelName) const;
363+
template <typename NameT>
364+
bool kernelUsesAssert(const NameT &KernelName) const {
365+
return m_KernelUsesAssert.find(KernelName) != m_KernelUsesAssert.end();
366+
}
364367

365368
SanitizerType kernelUsesSanitizer() const { return m_SanitizerFoundInImage; }
366369

@@ -503,7 +506,12 @@ class ProgramManager {
503506
bool m_UseSpvFile = false;
504507
RTDeviceBinaryImageUPtr m_SpvFileImage;
505508

506-
std::set<std::string> m_KernelUsesAssert;
509+
// std::less<> is a transparent comparator that enabled comparison between
510+
// different types without temporary key_type object creation. This includes
511+
// standard overloads, such as comparison between std::string and
512+
// std::string_view or just char*.
513+
using KernelUsesAssertSet = std::set<std::string, std::less<>>;
514+
KernelUsesAssertSet m_KernelUsesAssert;
507515
std::unordered_map<std::string, int> m_KernelImplicitLocalArgPos;
508516

509517
// Sanitizer type used in device image

sycl/unittests/program_manager/Cleanup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class ProgramManagerExposed : public sycl::detail::ProgramManager {
6464
return m_EliminatedKernelArgMasks;
6565
}
6666

67-
std::set<std::string> &getKernelUsesAssert() { return m_KernelUsesAssert; }
67+
KernelUsesAssertSet &getKernelUsesAssert() { return m_KernelUsesAssert; }
6868

6969
std::unordered_map<std::string, int> &getKernelImplicitLocalArgPos() {
7070
return m_KernelImplicitLocalArgPos;

0 commit comments

Comments
 (0)