diff options
author | Kshitij Sisodia <kshitij.sisodia@arm.com> | 2022-02-14 11:22:58 +0000 |
---|---|---|
committer | Kshitij Sisodia <kshitij.sisodia@arm.com> | 2022-02-14 12:27:31 +0000 |
commit | e2da7ee5e9732ec0d1962b7d74737b8ef5463a9e (patch) | |
tree | 7aefece1abd1facaed897a376428bdc23a6de33f /source/profiler/include/Profiler.hpp | |
parent | cb8a987ce714283b66db49d1bc9d5b108caaa707 (diff) | |
download | ml-embedded-evaluation-kit-e2da7ee5e9732ec0d1962b7d74737b8ef5463a9e.tar.gz |
MLECO-2970: Moving Profiler out as a CMake target.
Profiler is a stand alone static lib that will depend on
log and hal targets.
Change-Id: Ibbff289c6760982f54ae278d95a054e73db018c8
Diffstat (limited to 'source/profiler/include/Profiler.hpp')
-rw-r--r-- | source/profiler/include/Profiler.hpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/source/profiler/include/Profiler.hpp b/source/profiler/include/Profiler.hpp new file mode 100644 index 0000000..503d805 --- /dev/null +++ b/source/profiler/include/Profiler.hpp @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2022 Arm Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef APP_PROFILER_HPP +#define APP_PROFILER_HPP + +#include "hal.h" + +#include <string> +#include <map> +#include <vector> + +namespace arm { +namespace app { + + /** Statistics for a profiling metric. */ + struct Statistics { + std::string name; + std::string unit; + std::uint64_t total; + double avrg; + std::uint64_t min; + std::uint64_t max; + }; + + /** Profiling results with calculated statistics. */ + struct ProfileResult { + std::string name; + std::uint32_t samplesNum; + std::vector<Statistics> data; + }; + + /** A single profiling unit definition. */ + struct ProfilingUnit { + uint64_t npuCycles = 0; + uint64_t activeNpuCycles = 0; + uint64_t idleNpuCycles = 0; + uint64_t axi0writes = 0; + uint64_t axi0reads = 0; + uint64_t axi1reads = 0; + uint64_t cpuCycles = 0; + time_t time = 0; + }; + + /* A collection of profiling units. */ + using ProfilingSeries = std::vector<arm::app::ProfilingUnit>; + + /* A map for string identifiable profiling series. */ + using ProfilingMap = std::map<std::string, ProfilingSeries>; + + /** + * @brief A very simple profiler example using the platform timer + * implementation. + */ + class Profiler { + public: + /** + * @brief Constructor for profiler. + * @param[in] platform Pointer to a valid, initialised hal platform. + * @param[in] name A friendly name for this profiler. + **/ + Profiler(hal_platform* platform, const char* name); + + /** Block the default constructor. */ + Profiler() = delete; + + /** Default destructor. */ + ~Profiler() = default; + + /** @brief Start profiling => get starting time-stamp. */ + bool StartProfiling(const char* name = nullptr); + + /** @brief Stop profiling => get the ending time-stamp. */ + bool StopProfiling(); + + /** @brief Stops the profiling and internally resets the + * platform timers. */ + bool StopProfilingAndReset(); + + /** @brief Reset the platform timers. */ + void Reset(); + + /** + * @brief Collects profiling results statistics and resets the profiler. + **/ + void GetAllResultsAndReset(std::vector<ProfileResult>& results); + + /** + * @brief Prints collected profiling results and resets the profiler. + **/ + void PrintProfilingResult(bool printFullStat = false); + + /** @brief Set the profiler name. */ + void SetName(const char* str); + + private: + ProfilingMap m_series; /* Profiling series map. */ + time_counter m_tstampSt{}; /* Container for a current starting timestamp. */ + time_counter m_tstampEnd{}; /* Container for a current ending timestamp. */ + hal_platform * m_pPlatform = nullptr; /* Platform pointer - to get the timer. */ + + bool m_started = false; /* Indicates profiler has been started. */ + + std::string m_name; /* Name given to this profiler. */ + + /** + * @brief Appends the profiling unit computed by the "start" and + * "end" timestamps to the profiling series identified by + * the name provided. + * @param[in] start Starting time-stamp. + * @param[in] end Ending time-stamp. + * @param[in] name Name for the profiling unit series to be + * appended to. + **/ + void AddProfilingUnit(time_counter start, time_counter end, + const std::string& name); + }; + +} /* namespace app */ +} /* namespace arm */ + +#endif /* APP_PROFILER_HPP */ |