[Openmp-commits] [openmp] [OpenMP][NFC] Encapsulate profiling logic (PR #74003)

Johannes Doerfert via Openmp-commits openmp-commits at lists.llvm.org
Thu Nov 30 15:35:04 PST 2023


https://github.com/jdoerfert updated https://github.com/llvm/llvm-project/pull/74003

>From 634cc8a50b335d5083c793bab6cc0e676bef1ae4 Mon Sep 17 00:00:00 2001
From: Johannes Doerfert <johannes at jdoerfert.de>
Date: Thu, 30 Nov 2023 13:31:21 -0800
Subject: [PATCH] [OpenMP][NFC] Encapsulate profiling logic

This simply puts the profiling logic into the `Profiler` class and
allows non-RAII profiling via `beginSection` and `endSection`.
---
 openmp/docs/design/Runtimes.rst              |  7 +++
 openmp/libomptarget/include/Shared/Profile.h | 64 ++++++++++++++++++++
 openmp/libomptarget/src/rtl.cpp              | 16 +----
 3 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/openmp/docs/design/Runtimes.rst b/openmp/docs/design/Runtimes.rst
index e7371b34e0350f6..9002fa62348fb16 100644
--- a/openmp/docs/design/Runtimes.rst
+++ b/openmp/docs/design/Runtimes.rst
@@ -708,6 +708,7 @@ variables is defined below.
 
     * ``LIBOMPTARGET_DEBUG=<Num>``
     * ``LIBOMPTARGET_PROFILE=<Filename>``
+    * ``LIBOMPTARGET_PROFILE_GRANULARITY=<Num> (default 500, in us)``
     * ``LIBOMPTARGET_MEMORY_MANAGER_THRESHOLD=<Num>``
     * ``LIBOMPTARGET_INFO=<Num>``
     * ``LIBOMPTARGET_HEAP_SIZE=<Num>``
@@ -749,6 +750,12 @@ for time trace output. Note that this will turn ``libomp`` into a C++ library.
 
 .. _`LLVM Support Library`: https://llvm.org/docs/SupportLibrary.html
 
+LIBOMPTARGET_PROFILE_GRANULARITY
+""""""""""""""""""""""""""""""""
+
+``LIBOMPTARGET_PROFILE_GRANULARITY`` allows to change the time profile
+granularity measured in `us`. Default is 500 (`us`).
+
 LIBOMPTARGET_MEMORY_MANAGER_THRESHOLD
 """""""""""""""""""""""""""""""""""""
 
diff --git a/openmp/libomptarget/include/Shared/Profile.h b/openmp/libomptarget/include/Shared/Profile.h
index bbdefea06d90e85..316b0c3086d0489 100644
--- a/openmp/libomptarget/include/Shared/Profile.h
+++ b/openmp/libomptarget/include/Shared/Profile.h
@@ -10,8 +10,70 @@
 //
 //===----------------------------------------------------------------------===//
 
+#ifndef OMPTARGET_SHARED_PROFILE_H
+#define OMPTARGET_SHARED_PROFILE_H
+
+#include "Shared/Debug.h"
+#include "Shared/EnvironmentVar.h"
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/TimeProfiler.h"
 
+/// Class that holds the singleton profiler and allows to start/end events.
+class Profiler {
+
+  Profiler() {
+    if (!ProfileTraceFile.isPresent())
+      return;
+
+    // TODO: Add an alias without LIBOMPTARGET
+    // Flag to modify the profile granularity (in us).
+    Int32Envar ProfileGranularity =
+        Int32Envar("LIBOMPTARGET_PROFILE_GRANULARITY", 500);
+
+    llvm::timeTraceProfilerInitialize(ProfileGranularity /* us */,
+                                      "libomptarget");
+  }
+
+  ~Profiler() {
+    if (!ProfileTraceFile.isPresent())
+      return;
+
+    if (auto Err = llvm::timeTraceProfilerWrite(ProfileTraceFile.get(), "-"))
+      REPORT("Error writing out the time trace: %s\n",
+             llvm::toString(std::move(Err)).c_str());
+
+    llvm::timeTraceProfilerCleanup();
+  }
+
+  // TODO: Add an alias without LIBOMPTARGET
+  /// Flag to enable profiling which also specifies the file profile information
+  /// is stored in.
+  StringEnvar ProfileTraceFile = StringEnvar("LIBOMPTARGET_PROFILE");
+
+public:
+  static Profiler &get() {
+    static Profiler P;
+    return P;
+  }
+
+  /// Manually begin a time section, with the given \p Name and \p Detail.
+  /// Profiler copies the string data, so the pointers can be given into
+  /// temporaries. Time sections can be hierarchical; every Begin must have a
+  /// matching End pair but they can nest.
+  void beginSection(llvm::StringRef Name, llvm::StringRef Detail) {
+    llvm::timeTraceProfilerBegin(Name, Detail);
+  }
+  void beginSection(llvm::StringRef Name,
+                    llvm::function_ref<std::string()> Detail) {
+    llvm::timeTraceProfilerBegin(Name, Detail);
+  }
+
+  /// Manually end the last time section.
+  void endSection() { llvm::timeTraceProfilerEnd(); }
+};
+
 /// Time spend in the current scope, assigned to the function name.
 #define TIMESCOPE() llvm::TimeTraceScope TimeScope(__FUNCTION__)
 
@@ -34,3 +96,5 @@
   std::string ProfileLocation = SI.getProfileLocation();                       \
   std::string RTM = RegionTypeMsg;                                             \
   llvm::TimeTraceScope TimeScope(__FUNCTION__, ProfileLocation + RTM)
+
+#endif // OMPTARGET_SHARED_PROFILE_H
diff --git a/openmp/libomptarget/src/rtl.cpp b/openmp/libomptarget/src/rtl.cpp
index 09084be12a76e2a..42d147d1c1453f2 100644
--- a/openmp/libomptarget/src/rtl.cpp
+++ b/openmp/libomptarget/src/rtl.cpp
@@ -41,8 +41,6 @@ static const char *RTLNames[] = {
     /* AMDGPU target        */ "libomptarget.rtl.amdgpu",
 };
 
-static char *ProfileTraceFile = nullptr;
-
 #ifdef OMPT_SUPPORT
 extern void ompt::connectLibrary();
 #endif
@@ -64,16 +62,12 @@ __attribute__((constructor(101))) void init() {
 
   PM = new PluginManager(UseEventsForAtomicTransfers);
 
-  ProfileTraceFile = getenv("LIBOMPTARGET_PROFILE");
-  // TODO: add a configuration option for time granularity
-  if (ProfileTraceFile)
-    timeTraceProfilerInitialize(500 /* us */, "libomptarget");
-
 #ifdef OMPT_SUPPORT
   // Initialize OMPT first
   ompt::connectLibrary();
 #endif
 
+  Profiler::get();
   PM->RTLs.loadRTLs();
   PM->registerDelayedLibraries();
 }
@@ -81,14 +75,6 @@ __attribute__((constructor(101))) void init() {
 __attribute__((destructor(101))) void deinit() {
   DP("Deinit target library!\n");
   delete PM;
-
-  if (ProfileTraceFile) {
-    // TODO: add env var for file output
-    if (auto E = timeTraceProfilerWrite(ProfileTraceFile, "-"))
-      fprintf(stderr, "Error writing out the time trace\n");
-
-    timeTraceProfilerCleanup();
-  }
 }
 
 void PluginAdaptorManagerTy::loadRTLs() {



More information about the Openmp-commits mailing list