aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichalis Spyrou <michalis.spyrou@arm.com>2021-01-27 14:52:46 +0000
committerMichalis Spyrou <michalis.spyrou@arm.com>2021-02-15 12:05:11 +0000
commitd5112700d2f5673d9151338f4861c50b019552ef (patch)
tree0cd1a50869f2273374e91f6b30c6e48ca7f6237c
parentc22eb1b2a4c68735e01d64cfb83efae5375901b0 (diff)
downloadComputeLibrary-d5112700d2f5673d9151338f4861c50b019552ef.tar.gz
Add WallClockTimer support for bare metal.
Change-Id: I8f92a71fc6f5190ca3bb664208244f8bff1270af Signed-off-by: Michalis Spyrou <michalis.spyrou@arm.com> Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/5066 Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Giorgio Arena <giorgio.arena@arm.com> Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
-rw-r--r--tests/framework/instruments/WallClockTimer.cpp44
-rw-r--r--tests/framework/instruments/WallClockTimer.h11
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<output_timestamps>::id() const
template <bool output_timestamps>
void WallClock<output_timestamps>::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 <bool output_timestamps>
void WallClock<output_timestamps>::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 <bool output_timestamps>
@@ -63,14 +94,23 @@ Instrument::MeasurementsMap WallClock<output_timestamps>::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<uint64_t>(_scale_factor), _unit));
+ measurements.emplace("[end]Wall clock time", Measurement(_stop / static_cast<uint64_t>(_scale_factor), _unit));
+#else // !defined(BARE_METAL)
measurements.emplace("[start]Wall clock time", Measurement(_start.time_since_epoch().count() / static_cast<uint64_t>(1000 * _scale_factor), _unit));
measurements.emplace("[end]Wall clock time", Measurement(_stop.time_since_epoch().count() / static_cast<uint64_t>(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<double>(1000 * _scale_factor), _unit));
+#else // !defined(BARE_METAL)
const auto delta = std::chrono::duration_cast<std::chrono::microseconds>(_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<false>;