[Openmp-commits] [openmp] [OpenMP][NFC] Extract OffloadPolicy into a helper class (PR #74029)

Johannes Doerfert via Openmp-commits openmp-commits at lists.llvm.org
Thu Nov 30 18:50:36 PST 2023


https://github.com/jdoerfert created https://github.com/llvm/llvm-project/pull/74029

OpenMP allows 3 different offload policies, handling of which we want to encapsulate.

>From eef505a9b78970394639b660aee93d087756ea2d Mon Sep 17 00:00:00 2001
From: Johannes Doerfert <johannes at jdoerfert.de>
Date: Thu, 30 Nov 2023 16:08:22 -0800
Subject: [PATCH] [OpenMP][NFC] Extract OffloadPolicy into a helper class

OpenMP allows 3 different offload policies, handling of which we want to
encapsulate.
---
 openmp/libomptarget/include/OffloadPolicy.h | 63 +++++++++++++++++++++
 openmp/libomptarget/include/PluginManager.h |  4 --
 openmp/libomptarget/include/device.h        |  8 ---
 openmp/libomptarget/src/omptarget.cpp       | 34 ++---------
 openmp/libomptarget/src/rtl.cpp             |  7 ---
 5 files changed, 68 insertions(+), 48 deletions(-)
 create mode 100644 openmp/libomptarget/include/OffloadPolicy.h

diff --git a/openmp/libomptarget/include/OffloadPolicy.h b/openmp/libomptarget/include/OffloadPolicy.h
new file mode 100644
index 000000000000000..858d9c323b15a20
--- /dev/null
+++ b/openmp/libomptarget/include/OffloadPolicy.h
@@ -0,0 +1,63 @@
+//===-- OffloadPolicy.h - Configuration of offload behavior -----*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// Configuration for offload behavior, e.g., if offload is disabled, can be
+// disabled, is mandatory, etc.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef OMPTARGET_OFFLOAD_POLICY_H
+#define OMPTARGET_OFFLOAD_POLICY_H
+
+#include "PluginManager.h"
+
+enum kmp_target_offload_kind_t {
+  tgt_disabled = 0,
+  tgt_default = 1,
+  tgt_mandatory = 2
+};
+
+extern "C" int __kmpc_get_target_offload(void) __attribute__((weak));
+
+class OffloadPolicy {
+
+  OffloadPolicy(PluginManager &PM) {
+    // TODO: Check for OpenMP.
+    switch ((kmp_target_offload_kind_t)__kmpc_get_target_offload()) {
+    case tgt_disabled:
+      Kind = DISABLED;
+      return;
+    case tgt_mandatory:
+      Kind = MANDATORY;
+      return;
+    default:
+      if (PM.getNumDevices()) {
+        DP("Default TARGET OFFLOAD policy is now mandatory "
+           "(devices were found)\n");
+        Kind = MANDATORY;
+      } else {
+        DP("Default TARGET OFFLOAD policy is now disabled "
+           "(no devices were found)\n");
+        Kind = DISABLED;
+      }
+      return;
+    };
+  }
+
+public:
+  static const OffloadPolicy &get(PluginManager &PM) {
+    static OffloadPolicy OP(PM);
+    return OP;
+  }
+
+  enum OffloadPolicyKind { DISABLED, MANDATORY };
+
+  OffloadPolicyKind Kind = MANDATORY;
+};
+
+#endif // OMPTARGET_OFFLOAD_POLICY_H
diff --git a/openmp/libomptarget/include/PluginManager.h b/openmp/libomptarget/include/PluginManager.h
index c92884d8e27df7a..55f74268dc99e1f 100644
--- a/openmp/libomptarget/include/PluginManager.h
+++ b/openmp/libomptarget/include/PluginManager.h
@@ -114,10 +114,6 @@ struct PluginManager {
   HostPtrToTableMapTy HostPtrToTableMap;
   std::mutex TblMapMtx; ///< For HostPtrToTableMap
 
-  // Store target policy (disabled, mandatory, default)
-  kmp_target_offload_kind_t TargetOffloadPolicy = tgt_default;
-  std::mutex TargetOffloadMtx; ///< For TargetOffloadPolicy
-
   // Work around for plugins that call dlopen on shared libraries that call
   // tgt_register_lib during their initialisation. Stash the pointers in a
   // vector until the plugins are all initialised and then register them.
diff --git a/openmp/libomptarget/include/device.h b/openmp/libomptarget/include/device.h
index 8d253df19215ef0..6602ee052ddd330 100644
--- a/openmp/libomptarget/include/device.h
+++ b/openmp/libomptarget/include/device.h
@@ -33,14 +33,6 @@ struct PluginAdaptorTy;
 struct __tgt_bin_desc;
 struct __tgt_target_table;
 
-// enum for OMP_TARGET_OFFLOAD; keep in sync with kmp.h definition
-enum kmp_target_offload_kind {
-  tgt_disabled = 0,
-  tgt_default = 1,
-  tgt_mandatory = 2
-};
-typedef enum kmp_target_offload_kind kmp_target_offload_kind_t;
-
 ///
 struct PendingCtorDtorListsTy {
   std::list<void *> PendingCtors;
diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp
index 9d75fd360108fa6..839c709f906cb62 100644
--- a/openmp/libomptarget/src/omptarget.cpp
+++ b/openmp/libomptarget/src/omptarget.cpp
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "omptarget.h"
+#include "OffloadPolicy.h"
 #include "OpenMP/OMPT/Callback.h"
 #include "OpenMP/OMPT/Interface.h"
 #include "PluginManager.h"
@@ -281,17 +282,13 @@ static int initLibrary(DeviceTy &Device) {
 }
 
 void handleTargetOutcome(bool Success, ident_t *Loc) {
-  switch (PM->TargetOffloadPolicy) {
-  case tgt_disabled:
+  switch (OffloadPolicy::get(*PM).Kind) {
+  case OffloadPolicy::DISABLED:
     if (Success) {
       FATAL_MESSAGE0(1, "expected no offloading while offloading is disabled");
     }
     break;
-  case tgt_default:
-    FATAL_MESSAGE0(1, "default offloading policy must be switched to "
-                      "mandatory or disabled");
-    break;
-  case tgt_mandatory:
+  case OffloadPolicy::MANDATORY:
     if (!Success) {
       if (getInfoLevel() & OMP_INFOTYPE_DUMP_TABLE)
         for (auto &Device : PM->Devices)
@@ -329,27 +326,6 @@ void handleTargetOutcome(bool Success, ident_t *Loc) {
   }
 }
 
-static void handleDefaultTargetOffload() {
-  std::lock_guard<decltype(PM->TargetOffloadMtx)> LG(PM->TargetOffloadMtx);
-  if (PM->TargetOffloadPolicy == tgt_default) {
-    if (omp_get_num_devices() > 0) {
-      DP("Default TARGET OFFLOAD policy is now mandatory "
-         "(devices were found)\n");
-      PM->TargetOffloadPolicy = tgt_mandatory;
-    } else {
-      DP("Default TARGET OFFLOAD policy is now disabled "
-         "(no devices were found)\n");
-      PM->TargetOffloadPolicy = tgt_disabled;
-    }
-  }
-}
-
-static bool isOffloadDisabled() {
-  if (PM->TargetOffloadPolicy == tgt_default)
-    handleDefaultTargetOffload();
-  return PM->TargetOffloadPolicy == tgt_disabled;
-}
-
 // If offload is enabled, ensure that device DeviceID has been initialized,
 // global ctors have been executed, and global data has been mapped.
 //
@@ -363,7 +339,7 @@ static bool isOffloadDisabled() {
 // If DeviceID == OFFLOAD_DEVICE_DEFAULT, set DeviceID to the default device.
 // This step might be skipped if offload is disabled.
 bool checkDeviceAndCtors(int64_t &DeviceID, ident_t *Loc) {
-  if (isOffloadDisabled()) {
+  if (OffloadPolicy::get(*PM).Kind == OffloadPolicy::DISABLED) {
     DP("Offload is disabled\n");
     return true;
   }
diff --git a/openmp/libomptarget/src/rtl.cpp b/openmp/libomptarget/src/rtl.cpp
index 3cc7ac381640d2e..aaa37db59195c9f 100644
--- a/openmp/libomptarget/src/rtl.cpp
+++ b/openmp/libomptarget/src/rtl.cpp
@@ -66,13 +66,6 @@ __attribute__((destructor(101))) void deinit() {
 }
 
 void PluginAdaptorManagerTy::loadRTLs() {
-  // Parse environment variable OMP_TARGET_OFFLOAD (if set)
-  PM->TargetOffloadPolicy =
-      (kmp_target_offload_kind_t)__kmpc_get_target_offload();
-  if (PM->TargetOffloadPolicy == tgt_disabled) {
-    return;
-  }
-
   DP("Loading RTLs...\n");
 
   // Attempt to open all the plugins and, if they exist, check if the interface



More information about the Openmp-commits mailing list