annotate llvm/tools/llvm-exegesis/lib/BenchmarkResult.h @ 201:a96fbbdf2d0f

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 04 Jun 2021 21:07:06 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- BenchmarkResult.h ---------------------------------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 ///
anatofuz
parents:
diff changeset
9 /// \file
anatofuz
parents:
diff changeset
10 /// Defines classes to represent measurements and serialize/deserialize them to
anatofuz
parents:
diff changeset
11 // Yaml.
anatofuz
parents:
diff changeset
12 ///
anatofuz
parents:
diff changeset
13 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 #ifndef LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRESULT_H
anatofuz
parents:
diff changeset
16 #define LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRESULT_H
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 #include "LlvmState.h"
anatofuz
parents:
diff changeset
19 #include "RegisterValue.h"
anatofuz
parents:
diff changeset
20 #include "llvm/ADT/StringMap.h"
anatofuz
parents:
diff changeset
21 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
22 #include "llvm/MC/MCInst.h"
anatofuz
parents:
diff changeset
23 #include "llvm/MC/MCInstBuilder.h"
anatofuz
parents:
diff changeset
24 #include "llvm/Support/YAMLTraits.h"
anatofuz
parents:
diff changeset
25 #include <limits>
anatofuz
parents:
diff changeset
26 #include <string>
anatofuz
parents:
diff changeset
27 #include <unordered_map>
anatofuz
parents:
diff changeset
28 #include <vector>
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 namespace llvm {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 class Error;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32
150
anatofuz
parents:
diff changeset
33 namespace exegesis {
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 struct InstructionBenchmarkKey {
anatofuz
parents:
diff changeset
36 // The LLVM opcode name.
anatofuz
parents:
diff changeset
37 std::vector<MCInst> Instructions;
anatofuz
parents:
diff changeset
38 // The initial values of the registers.
anatofuz
parents:
diff changeset
39 std::vector<RegisterValue> RegisterInitialValues;
anatofuz
parents:
diff changeset
40 // An opaque configuration, that can be used to separate several benchmarks of
anatofuz
parents:
diff changeset
41 // the same instruction under different configurations.
anatofuz
parents:
diff changeset
42 std::string Config;
anatofuz
parents:
diff changeset
43 };
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 struct BenchmarkMeasure {
anatofuz
parents:
diff changeset
46 // A helper to create an unscaled BenchmarkMeasure.
anatofuz
parents:
diff changeset
47 static BenchmarkMeasure Create(std::string Key, double Value) {
anatofuz
parents:
diff changeset
48 return {Key, Value, Value};
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50 std::string Key;
anatofuz
parents:
diff changeset
51 // This is the per-instruction value, i.e. measured quantity scaled per
anatofuz
parents:
diff changeset
52 // instruction.
anatofuz
parents:
diff changeset
53 double PerInstructionValue;
anatofuz
parents:
diff changeset
54 // This is the per-snippet value, i.e. measured quantity for one repetition of
anatofuz
parents:
diff changeset
55 // the whole snippet.
anatofuz
parents:
diff changeset
56 double PerSnippetValue;
anatofuz
parents:
diff changeset
57 };
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 // The result of an instruction benchmark.
anatofuz
parents:
diff changeset
60 struct InstructionBenchmark {
anatofuz
parents:
diff changeset
61 InstructionBenchmarkKey Key;
anatofuz
parents:
diff changeset
62 enum ModeE { Unknown, Latency, Uops, InverseThroughput };
anatofuz
parents:
diff changeset
63 ModeE Mode;
anatofuz
parents:
diff changeset
64 std::string CpuName;
anatofuz
parents:
diff changeset
65 std::string LLVMTriple;
anatofuz
parents:
diff changeset
66 // Which instruction is being benchmarked here?
anatofuz
parents:
diff changeset
67 const MCInst &keyInstruction() const { return Key.Instructions[0]; }
anatofuz
parents:
diff changeset
68 // The number of instructions inside the repeated snippet. For example, if a
anatofuz
parents:
diff changeset
69 // snippet of 3 instructions is repeated 4 times, this is 12.
anatofuz
parents:
diff changeset
70 int NumRepetitions = 0;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
71 enum RepetitionModeE { Duplicate, Loop, AggregateMin };
150
anatofuz
parents:
diff changeset
72 // Note that measurements are per instruction.
anatofuz
parents:
diff changeset
73 std::vector<BenchmarkMeasure> Measurements;
anatofuz
parents:
diff changeset
74 std::string Error;
anatofuz
parents:
diff changeset
75 std::string Info;
anatofuz
parents:
diff changeset
76 std::vector<uint8_t> AssembledSnippet;
anatofuz
parents:
diff changeset
77
anatofuz
parents:
diff changeset
78 // Read functions.
anatofuz
parents:
diff changeset
79 static Expected<InstructionBenchmark> readYaml(const LLVMState &State,
anatofuz
parents:
diff changeset
80 StringRef Filename);
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 static Expected<std::vector<InstructionBenchmark>>
anatofuz
parents:
diff changeset
83 readYamls(const LLVMState &State, StringRef Filename);
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 class Error readYamlFrom(const LLVMState &State, StringRef InputContent);
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 // Write functions, non-const because of YAML traits.
anatofuz
parents:
diff changeset
88 class Error writeYamlTo(const LLVMState &State, raw_ostream &S);
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 class Error writeYaml(const LLVMState &State, const StringRef Filename);
anatofuz
parents:
diff changeset
91 };
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 //------------------------------------------------------------------------------
anatofuz
parents:
diff changeset
94 // Utilities to work with Benchmark measures.
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 // A class that measures stats over benchmark measures.
anatofuz
parents:
diff changeset
97 class PerInstructionStats {
anatofuz
parents:
diff changeset
98 public:
anatofuz
parents:
diff changeset
99 void push(const BenchmarkMeasure &BM);
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 double avg() const {
anatofuz
parents:
diff changeset
102 assert(NumValues);
anatofuz
parents:
diff changeset
103 return SumValues / NumValues;
anatofuz
parents:
diff changeset
104 }
anatofuz
parents:
diff changeset
105 double min() const { return MinValue; }
anatofuz
parents:
diff changeset
106 double max() const { return MaxValue; }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 const std::string &key() const { return Key; }
anatofuz
parents:
diff changeset
109
anatofuz
parents:
diff changeset
110 private:
anatofuz
parents:
diff changeset
111 std::string Key;
anatofuz
parents:
diff changeset
112 double SumValues = 0.0;
anatofuz
parents:
diff changeset
113 int NumValues = 0;
anatofuz
parents:
diff changeset
114 double MaxValue = std::numeric_limits<double>::min();
anatofuz
parents:
diff changeset
115 double MinValue = std::numeric_limits<double>::max();
anatofuz
parents:
diff changeset
116 };
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 } // namespace exegesis
anatofuz
parents:
diff changeset
119 } // namespace llvm
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 #endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRESULT_H