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 | |
11 | namespace taichi { |
12 | |
13 | class 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 | |
62 | TI_INTERFACE(Benchmark) |
63 | |
64 | } // namespace taichi |
65 |