diff options
author | Johannes Doerfert <johannes@jdoerfert.de> | 2023-11-30 15:52:02 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-30 15:52:02 -0800 |
commit | b8b2a279d002f4d424d9b089bc32a0e5d6989dbb (patch) | |
tree | 7cc7ba6f31ad65466b2a66f712937e7cc66bb788 /openmp | |
parent | 3dbac2c007c114a720300d2a4d79abe9ca1351e7 (diff) | |
download | llvm-b8b2a279d002f4d424d9b089bc32a0e5d6989dbb.zip llvm-b8b2a279d002f4d424d9b089bc32a0e5d6989dbb.tar.gz llvm-b8b2a279d002f4d424d9b089bc32a0e5d6989dbb.tar.bz2 |
[OpenMP][NFC] Encapsulate profiling logic (#74003)
This simply puts the profiling logic into the `Profiler` class and
allows non-RAII profiling via `beginSection` and `endSection`.
Diffstat (limited to 'openmp')
-rw-r--r-- | openmp/docs/design/Runtimes.rst | 7 | ||||
-rw-r--r-- | openmp/libomptarget/include/Shared/Profile.h | 64 | ||||
-rw-r--r-- | 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 e7371b3..9002fa6 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 bbdefea..316b0c3 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 09084be..42d147d 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() { |