1/*******************************************************************************
2 Copyright (c) The Taichi Authors (2016- ). All Rights Reserved.
3 The use of this software is governed by the LICENSE file.
4*******************************************************************************/
5
6#pragma once
7
8#include "taichi/common/interface.h"
9#include "taichi/system/timer.h"
10
11namespace taichi {
12
13class Benchmark : public Unit {
14 protected:
15 int dummy;
16 int warm_up_iterations;
17 int64 workload;
18 bool returns_time;
19
20 virtual void setup(){};
21
22 virtual void iterate() = 0;
23
24 virtual void finalize(){};
25
26 public:
27 void initialize(const Config &config) override {
28 warm_up_iterations = config.get("warm_up_iterations", 16);
29 workload = config.get("workload", int64(1024));
30 returns_time = config.get("returns_time", false);
31 }
32
33 // returns cycles per element (default) / time per element
34 virtual real run(int iterations = 16) {
35 setup();
36 for (int i = 0; i < warm_up_iterations; i++) {
37 iterate();
38 }
39 double start_t;
40 if (returns_time)
41 start_t = Time::get_time();
42 else
43 start_t = (double)Time::get_cycles();
44 for (int i = 0; i < iterations; i++) {
45 iterate();
46 }
47 double end_t;
48 if (returns_time)
49 end_t = Time::get_time();
50 else
51 end_t = (double)Time::get_cycles();
52 real elapsed = (real)(end_t - start_t);
53 finalize();
54 return elapsed / (iterations * workload);
55 }
56
57 bool test() const override {
58 return true;
59 }
60};
61
62TI_INTERFACE(Benchmark)
63
64} // namespace taichi
65