Skip to content

Commit f2de935

Browse files
committed
Keep separate KernelNames list and MangledKernelNames map
Signed-off-by: Julian Oppermann <julian.oppermann@codeplay.com>
1 parent 58dfefb commit f2de935

File tree

1 file changed

+38
-52
lines changed

1 file changed

+38
-52
lines changed

sycl/source/detail/kernel_bundle_impl.hpp

Lines changed: 38 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ class kernel_bundle_impl {
381381
kernel_bundle_impl(
382382
context Ctx, std::vector<device> Devs,
383383
const std::vector<kernel_id> &KernelIDs,
384+
std::vector<std::string> &&KernelNames,
384385
std::unordered_map<std::string, std::string> &&MangledKernelNames,
385386
sycl_device_binaries Binaries, std::string &&Prefix,
386387
syclex::source_language Lang)
@@ -393,6 +394,7 @@ class kernel_bundle_impl {
393394
// loaded via the program manager have `kernel_id`s, they can't be looked up
394395
// from the (unprefixed) kernel name.
395396
MIsInterop = true;
397+
MKernelNames = std::move(KernelNames);
396398
MMangledKernelNames = std::move(MangledKernelNames);
397399
MDeviceBinaries = Binaries;
398400
MPrefix = std::move(Prefix);
@@ -530,6 +532,7 @@ class kernel_bundle_impl {
530532
PM.addImages(Binaries);
531533

532534
std::vector<kernel_id> KernelIDs;
535+
std::vector<std::string> KernelNames;
533536
std::unordered_map<std::string, std::string> MangledKernelNames;
534537
// `jit_compiler::compileSYCL(..)` uses `CompilationID + '$'` as prefix
535538
// for offload entry names.
@@ -539,18 +542,14 @@ class kernel_bundle_impl {
539542
if (KernelName.find(Prefix) == 0) {
540543
KernelIDs.push_back(KernelID);
541544
KernelName.remove_prefix(Prefix.length());
545+
KernelNames.emplace_back(KernelName);
542546
static constexpr std::string_view SYCLKernelMarker{"__sycl_kernel_"};
543547
if (KernelName.find(SYCLKernelMarker) == 0) {
544-
// extern "C" declaration, register kernel without the marker.
548+
// extern "C" declaration, implicitly register kernel without the
549+
// marker.
545550
std::string_view KernelNameWithoutMarker{KernelName};
546551
KernelNameWithoutMarker.remove_prefix(SYCLKernelMarker.length());
547552
MangledKernelNames.emplace(KernelNameWithoutMarker, KernelName);
548-
} else {
549-
// The marker is baked into the mangling, and we cannot easily
550-
// adjust it. Register an identity mapping as an escape hatch.
551-
// Users shall use `registered_kernel_names` instead, as there's
552-
// practically no way to guess the mangled name.
553-
MangledKernelNames.emplace(KernelName, KernelName);
554553
}
555554
}
556555
}
@@ -569,8 +568,9 @@ class kernel_bundle_impl {
569568
}
570569

571570
return std::make_shared<kernel_bundle_impl>(
572-
MContext, MDevices, KernelIDs, std::move(MangledKernelNames),
573-
Binaries, std::move(Prefix), MLanguage);
571+
MContext, MDevices, KernelIDs, std::move(KernelNames),
572+
std::move(MangledKernelNames), Binaries, std::move(Prefix),
573+
MLanguage);
574574
}
575575

576576
ur_program_handle_t UrProgram = nullptr;
@@ -676,48 +676,46 @@ class kernel_bundle_impl {
676676
KernelNames, MLanguage);
677677
}
678678

679-
std::string adjust_kernel_name(const std::string &Name,
680-
syclex::source_language Lang) {
681-
// Once name demangling support is in, we won't need this.
682-
if (Lang != syclex::source_language::sycl &&
683-
Lang != syclex::source_language::sycl_jit)
684-
return Name;
679+
std::string adjust_kernel_name(const std::string &Name) {
680+
if (MLanguage == syclex::source_language::sycl_jit) {
681+
auto It = MMangledKernelNames.find(Name);
682+
return It == MMangledKernelNames.end() ? Name : It->second;
683+
}
684+
685+
if (MLanguage == syclex::source_language::sycl) {
686+
bool isMangled = Name.find("__sycl_kernel_") != std::string::npos;
687+
return isMangled ? Name : "__sycl_kernel_" + Name;
688+
}
689+
690+
return Name;
691+
}
685692

686-
bool isMangled = Name.find("__sycl_kernel_") != std::string::npos;
687-
return isMangled ? Name : "__sycl_kernel_" + Name;
693+
bool is_kernel_name(const std::string &Name) {
694+
return std::find(MKernelNames.begin(), MKernelNames.end(), Name) !=
695+
MKernelNames.end();
688696
}
689697

690698
bool ext_oneapi_has_kernel(const std::string &Name) {
691-
if (MLanguage == syclex::source_language::sycl_jit) {
692-
return MMangledKernelNames.count(Name);
693-
}
694-
auto it = std::find(MKernelNames.begin(), MKernelNames.end(),
695-
adjust_kernel_name(Name, MLanguage));
696-
return it != MKernelNames.end();
699+
return is_kernel_name(adjust_kernel_name(Name));
697700
}
698701

699702
kernel
700703
ext_oneapi_get_kernel(const std::string &Name,
701704
const std::shared_ptr<kernel_bundle_impl> &Self) {
702-
if (MLanguage == syclex::source_language::sycl_jit) {
703-
if (MMangledKernelNames.empty()) {
704-
throw sycl::exception(
705-
make_error_code(errc::invalid),
706-
"'ext_oneapi_get_kernel' is only available in kernel_bundles "
707-
"successfully built from "
708-
"kernel_bundle<bundle_state::ext_oneapi_source>.");
709-
}
705+
if (MKernelNames.empty())
706+
throw sycl::exception(make_error_code(errc::invalid),
707+
"'ext_oneapi_get_kernel' is only available in "
708+
"kernel_bundles successfully built from "
709+
"kernel_bundle<bundle_state::ext_oneapi_source>.");
710710

711-
auto It = MMangledKernelNames.find(Name);
712-
if (It == MMangledKernelNames.end()) {
713-
throw sycl::exception(make_error_code(errc::invalid),
714-
"kernel '" + Name +
715-
"' not found in kernel_bundle");
716-
}
711+
std::string AdjustedName = adjust_kernel_name(Name);
712+
if (!is_kernel_name(AdjustedName))
713+
throw sycl::exception(make_error_code(errc::invalid),
714+
"kernel '" + Name + "' not found in kernel_bundle");
717715

718-
const std::string &MangledName = It->second;
716+
if (MLanguage == syclex::source_language::sycl_jit) {
719717
auto &PM = ProgramManager::getInstance();
720-
auto KID = PM.getSYCLKernelID(MPrefix + MangledName);
718+
auto KID = PM.getSYCLKernelID(MPrefix + AdjustedName);
721719

722720
for (const auto &DevImgWithDeps : MDeviceImages) {
723721
const auto &DevImg = DevImgWithDeps.getMain();
@@ -727,7 +725,7 @@ class kernel_bundle_impl {
727725
const auto &DevImgImpl = getSyclObjImpl(DevImg);
728726
auto UrProgram = DevImgImpl->get_ur_program_ref();
729727
auto [UrKernel, CacheMutex, ArgMask] =
730-
PM.getOrCreateKernel(MContext, MangledName,
728+
PM.getOrCreateKernel(MContext, AdjustedName,
731729
/*PropList=*/{}, UrProgram);
732730
auto KernelImpl = std::make_shared<kernel_impl>(
733731
UrKernel, getSyclObjImpl(MContext), DevImgImpl, Self, ArgMask,
@@ -738,18 +736,6 @@ class kernel_bundle_impl {
738736
assert(false && "Malformed RTC kernel bundle");
739737
}
740738

741-
if (MKernelNames.empty())
742-
throw sycl::exception(make_error_code(errc::invalid),
743-
"'ext_oneapi_get_kernel' is only available in "
744-
"kernel_bundles successfully built from "
745-
"kernel_bundle<bundle_state:ext_oneapi_source>.");
746-
747-
std::string AdjustedName = adjust_kernel_name(Name, MLanguage);
748-
if (!ext_oneapi_has_kernel(Name))
749-
throw sycl::exception(make_error_code(errc::invalid),
750-
"kernel '" + AdjustedName +
751-
"' not found in kernel_bundle");
752-
753739
assert(MDeviceImages.size() > 0);
754740
const std::shared_ptr<detail::device_image_impl> &DeviceImageImpl =
755741
detail::getSyclObjImpl(MDeviceImages[0].getMain());

0 commit comments

Comments
 (0)