//===- GenericProfiler.h - GenericProfiler interface for use in Plugins ---===// // // 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 // //===----------------------------------------------------------------------===// // // The GenericProfiler interface allows to implement profiler logic for various // backends, such as OMPT or other tracing mechanisms. // This enables the plugins to be agnostic of the actual high-level language // that is implemented. // //===----------------------------------------------------------------------===// #ifndef OFFLOAD_PLUGINS_NEXTGEN_COMMON_INCLUDE_GENERICPROFILER_H #define OFFLOAD_PLUGINS_NEXTGEN_COMMON_INCLUDE_GENERICPROFILER_H #include "Shared/APITypes.h" #include #include #include namespace llvm { namespace omp { namespace target { namespace plugin { struct GenericDeviceTy; struct GenericPluginTy; class GenericProfilerTy; template void callViaIndexSeq(FunT F, GenericProfilerTy *P, uint64_t StartNanos, uint64_t EndNanos, std::tuple Args, std::index_sequence) { F(P, StartNanos, EndNanos, std::get(Args)...); } template void callViaUnpack(FunT F, GenericProfilerTy *P, uint64_t StartNanos, uint64_t EndNanos, std::tuple Tup) { callViaIndexSeq(F, P, StartNanos, EndNanos, Tup, std::index_sequence_for{}); } /*** * Abstraction layer to implement different profiler backends. * * The plugins call into the GenericProfilerTy to handle the specific events * with whatever specific backend was instantiated. For now, the supported * backends are limited to an OMPT implementation. */ class GenericProfilerTy { public: GenericProfilerTy() = default; virtual ~GenericProfilerTy() = default; /// Obtain a pointer to profiler-specific data, if any. virtual void *getProfilerSpecificData() { return nullptr; } virtual bool isProfilingEnabled() { return false; } /// Set the factors which are used to interpolate the device clock compared to /// the host clock. This follows a simple linear interpolation: Slope *