From d5112700d2f5673d9151338f4861c50b019552ef Mon Sep 17 00:00:00 2001 From: Michalis Spyrou Date: Wed, 27 Jan 2021 14:52:46 +0000 Subject: Add WallClockTimer support for bare metal. Change-Id: I8f92a71fc6f5190ca3bb664208244f8bff1270af Signed-off-by: Michalis Spyrou Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/5066 Tested-by: Arm Jenkins Reviewed-by: Giorgio Arena Reviewed-by: Georgios Pinitas Comments-Addressed: Arm Jenkins --- tests/framework/instruments/WallClockTimer.cpp | 44 ++++++++++++++++++++++++-- tests/framework/instruments/WallClockTimer.h | 11 +++++-- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/tests/framework/instruments/WallClockTimer.cpp b/tests/framework/instruments/WallClockTimer.cpp index 9063da0613..763fb9ab27 100644 --- a/tests/framework/instruments/WallClockTimer.cpp +++ b/tests/framework/instruments/WallClockTimer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Arm Limited. + * Copyright (c) 2017-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -48,13 +48,44 @@ std::string WallClock::id() const template void WallClock::start() { +#if defined(BARE_METAL) + uint64_t tmp; + uint64_t retval; + + __asm __volatile( + "mrs %[tmp], pmcr_el0\n" + "orr %[tmp], %[tmp], #1\n" + "msr pmcr_el0, %[tmp]\n" + "mrs %[tmp], pmcntenset_el0\n" + "orr %[tmp], %[tmp], #1<<31\n" + "msr pmcntenset_el0, %[tmp]\n" + "mrs %[retval], pmccntr_el0\n" + : [tmp] "=r"(tmp), [retval] "=r"(retval)); + + _start = retval; +#else // !defined(BARE_METAL) _start = std::chrono::system_clock::now(); +#endif // defined(BARE_METAL) } template void WallClock::stop() { +#if defined(BARE_METAL) + uint64_t tmp; + uint64_t retval; + + __asm __volatile( + "mrs %[retval], pmccntr_el0\n" + "mov %[tmp], #0x3f\n" + "orr %[tmp], %[tmp], #1<<31\n" + "msr pmcntenclr_el0, %[tmp]\n" + : [tmp] "=r"(tmp), [retval] "=r"(retval)); + + _stop = retval; +#else // !defined(BARE_METAL) _stop = std::chrono::system_clock::now(); +#endif // defined(BARE_METAL) } template @@ -63,14 +94,23 @@ Instrument::MeasurementsMap WallClock::measurements() const MeasurementsMap measurements; if(output_timestamps) { - // _start / _stop are in ns, so divide by an extra 1000: +#if defined(BARE_METAL) + measurements.emplace("[start]Wall clock time", Measurement(_start / static_cast(_scale_factor), _unit)); + measurements.emplace("[end]Wall clock time", Measurement(_stop / static_cast(_scale_factor), _unit)); +#else // !defined(BARE_METAL) measurements.emplace("[start]Wall clock time", Measurement(_start.time_since_epoch().count() / static_cast(1000 * _scale_factor), _unit)); measurements.emplace("[end]Wall clock time", Measurement(_stop.time_since_epoch().count() / static_cast(1000 * _scale_factor), _unit)); +#endif // defined(BARE_METAL) } else { +#if defined(BARE_METAL) + const double delta = _stop - _start; + measurements.emplace("Wall clock time", Measurement(delta / static_cast(1000 * _scale_factor), _unit)); +#else // !defined(BARE_METAL) const auto delta = std::chrono::duration_cast(_stop - _start); measurements.emplace("Wall clock time", Measurement(delta.count() / _scale_factor, _unit)); +#endif // defined(BARE_METAL) } return measurements; } diff --git a/tests/framework/instruments/WallClockTimer.h b/tests/framework/instruments/WallClockTimer.h index 1ca4fe2c36..b1d7531f4e 100644 --- a/tests/framework/instruments/WallClockTimer.h +++ b/tests/framework/instruments/WallClockTimer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Arm Limited. + * Copyright (c) 2017-2021 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -70,9 +70,14 @@ public: MeasurementsMap measurements() const override; private: - std::chrono::system_clock::time_point _start{}; +#if defined(BARE_METAL) + uint64_t _start {}; + uint64_t _stop{}; +#else // !defined(BARE_METAL) + std::chrono::system_clock::time_point _start {}; std::chrono::system_clock::time_point _stop{}; - float _scale_factor{}; +#endif // defined(BARE_METAL) + float _scale_factor {}; }; using WallClockTimer = WallClock; -- cgit v1.2.1