summaryrefslogtreecommitdiff
path: root/tests/tools/tflite_benchmark/src/tflite_benchmark.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tools/tflite_benchmark/src/tflite_benchmark.cc')
-rw-r--r--tests/tools/tflite_benchmark/src/tflite_benchmark.cc44
1 files changed, 37 insertions, 7 deletions
diff --git a/tests/tools/tflite_benchmark/src/tflite_benchmark.cc b/tests/tools/tflite_benchmark/src/tflite_benchmark.cc
index d52ef0163..783a5cb2a 100644
--- a/tests/tools/tflite_benchmark/src/tflite_benchmark.cc
+++ b/tests/tools/tflite_benchmark/src/tflite_benchmark.cc
@@ -25,6 +25,7 @@
#include "misc/tensor/IndexIterator.h"
#include <chrono>
+#include <cmath>
#include <iostream>
#include <thread>
@@ -73,17 +74,27 @@ public:
{
++_num;
_sum += val;
+ _log_sum += std::log(val);
_min = std::min(_min, val);
_max = std::max(_max, val);
}
T mean() const { return _sum / static_cast<T>(_num); }
+ // Calculating geometric mean with logs
+ // "Geometric Mean of (V1, V2, ... Vn)"
+ // = (V1*V2*...*Vn)^(1/n)
+ // = exp(log((V1*V2*...*Vn)^(1/n)))
+ // = exp(log((V1*V2*...*Vn)/n)))
+ // = exp((log(V1) + log(V2) + ... + log(Vn))/n)
+ // = exp(_log_sum/num)
+ T geomean() const { return std::exp(_log_sum / static_cast<T>(_num)); }
T min() const { return _min; }
T max() const { return _max; }
private:
uint32_t _num = 0u;
T _sum = 0.0;
+ T _log_sum = 0.0;
T _min = std::numeric_limits<T>::max();
T _max = std::numeric_limits<T>::lowest();
};
@@ -118,6 +129,7 @@ int main(const int argc, char **argv)
const bool use_nnapi = nnfw::misc::EnvVar("USE_NNAPI").asBool(false);
const auto thread_count = nnfw::misc::EnvVar("THREAD").asInt(-1);
const auto pause = nnfw::misc::EnvVar("PAUSE").asInt(0);
+ const auto microsec = nnfw::misc::EnvVar("MICROSEC").asBool(0);
std::cout << "Num threads: " << thread_count << std::endl;
if (use_nnapi)
@@ -131,6 +143,18 @@ int main(const int argc, char **argv)
std::cout << "Insert " << pause << "s pause between iterations" << std::endl;
}
+ struct TimeUnit
+ {
+ const char *str;
+ std::function<int64_t(int64_t)> conv;
+ } tu = {"ms", [](int64_t v) { return v / 1000; }};
+
+ if (microsec)
+ {
+ tu.str = "us";
+ tu.conv = [](int64_t v) { return v; };
+ }
+
StderrReporter error_reporter;
std::unique_ptr<tflite::TfLiteVerifier> verifier{new BMFlatBufferVerifier};
@@ -198,7 +222,7 @@ int main(const int argc, char **argv)
//
for (uint32_t n = 0; n < 3; ++n)
{
- std::chrono::milliseconds elapsed(0);
+ std::chrono::microseconds elapsed(0);
sess->prepare();
@@ -256,7 +280,7 @@ int main(const int argc, char **argv)
};
sess->teardown();
- std::cout << "Warming-up " << n << ": " << elapsed.count() << "ms" << std::endl;
+ std::cout << "Warming-up " << n << ": " << tu.conv(elapsed.count()) << tu.str << std::endl;
}
//
@@ -268,7 +292,7 @@ int main(const int argc, char **argv)
for (int n = 0; n < cnt; ++n)
{
- std::chrono::milliseconds elapsed(0);
+ std::chrono::microseconds elapsed(0);
sess->prepare();
nnfw::misc::benchmark::measure(elapsed) << [&](void) {
@@ -281,7 +305,7 @@ int main(const int argc, char **argv)
acc(elapsed.count());
- std::cout << "Iteration " << n << ": " << elapsed.count() << "ms" << std::endl;
+ std::cout << "Iteration " << n << ": " << tu.conv(elapsed.count()) << tu.str << std::endl;
// Insert "pause"
if ((n != cnt - 1) && (pause > 0))
@@ -290,10 +314,16 @@ int main(const int argc, char **argv)
}
}
+ auto v_min = tu.conv(acc.min());
+ auto v_max = tu.conv(acc.max());
+ auto v_mean = tu.conv(acc.mean());
+ auto v_geomean = tu.conv(acc.geomean());
+
std::cout << "--------" << std::endl;
- std::cout << "Min: " << acc.min() << "ms" << std::endl;
- std::cout << "Max: " << acc.max() << "ms" << std::endl;
- std::cout << "Mean: " << acc.mean() << "ms" << std::endl;
+ std::cout << "Min: " << v_min << tu.str << std::endl;
+ std::cout << "Max: " << v_max << tu.str << std::endl;
+ std::cout << "Mean: " << v_mean << tu.str << std::endl;
+ std::cout << "GeoMean: " << v_geomean << tu.str << std::endl;
return 0;
}