[llvm] [offload][omp] Move reading _kernel_environment to libomptarget (PR #222606)
Alex Duran via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 10 05:54:22 PDT 2026
================
@@ -461,6 +466,67 @@ static int loadImagesOntoDevice(DeviceTy &Device) {
if (Device.RTL->get_function(Binary, Entry.SymbolName,
&DeviceEntry.Address) != OFFLOAD_SUCCESS)
REPORT() << "Failed to load kernel " << Entry.SymbolName;
+
+ // Read this kernel's launch-geometry properties once, from its
+ // "<name>_kernel_environment" device global, and cache them on
+ // the device for use at launch time.
+ std::string EnvName =
+ std::string(Entry.SymbolName) + "_kernel_environment";
+ KernelEnvironmentTy KernelEnv{};
+ void *KernelEnvPtr = nullptr;
+ bool ReadOk =
+ Device.RTL->get_global(Binary, sizeof(KernelEnv), EnvName.c_str(),
+ &KernelEnvPtr) == OFFLOAD_SUCCESS &&
+ Device.RTL->data_retrieve(DeviceId, &KernelEnv, KernelEnvPtr,
+ sizeof(KernelEnv)) == OFFLOAD_SUCCESS;
+ if (!ReadOk) {
+ KernelEnv = KernelEnvironmentTy{};
+ // If no kernel environment is found, the host kernels are expected
+ // to run in Generic execution mode. Other backends expect to be run
+ // in Bare mode.
+ if (Device.RTL == PM->getHostPlugin())
+ KernelEnv.Configuration.ExecMode =
+ llvm::omp::OMP_TGT_EXEC_MODE_GENERIC;
+ else
+ KernelEnv.Configuration.ExecMode =
+ llvm::omp::OMP_TGT_EXEC_MODE_BARE;
+ ODBG(ODT_Mapping)
+ << "Failed to read kernel environment for '" << Entry.SymbolName
+ << "', using default "
+ << KernelLaunchInfoTy::getExecutionModeName(
+ static_cast<llvm::omp::OMPTgtExecModeFlags>(
+ KernelEnv.Configuration.ExecMode))
+ << " execution mode";
+ }
+
+ llvm::omp::target::plugin::GenericDeviceTy &GenericDevice =
+ Device.RTL->getDevice(DeviceId);
+ auto *Kernel =
+ reinterpret_cast<llvm::omp::target::plugin::GenericKernelTy *>(
+ DeviceEntry.Address);
+ const auto &Cfg = KernelEnv.Configuration;
+ KernelLaunchInfoTy LaunchInfo;
+ LaunchInfo.Mode =
+ static_cast<llvm::omp::OMPTgtExecModeFlags>(Cfg.ExecMode);
+ LaunchInfo.ReductionDataSize = Cfg.ReductionDataSize;
+ // Max = Config.Max > 0 ? min(Config.Max, Device.Max) : Device.Max,
+ // further clamped to the kernel function's own driver-reported
+ // maximum.
+ LaunchInfo.MaxNumThreads =
+ std::min(Cfg.MaxThreads > 0
+ ? std::min(Cfg.MaxThreads,
+ int32_t(GenericDevice.getThreadLimit()))
+ : GenericDevice.getThreadLimit(),
+ Kernel->getMaxThreads());
+ // Pref = Config.Pref > 0 ? max(Config.Pref, Device.Pref)
----------------
adurang wrote:
It's a comemnt that was in the moved code. Seems not very useful to me, but just copied everything verbatim :)
Shall I get rid of it?
https://github.com/llvm/llvm-project/pull/222606
More information about the llvm-commits
mailing list