[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