llvm.org GIT mirror llvm / 71f2f61
[llvm-exegesis] Cut run time of analysis mode by -84% (*sic*) (YamlContext::getInstrOpcode()) Summary: ``` $ perf stat -r 9 ./bin/llvm-exegesis -mode=analysis -analysis-epsilon=1.0 -benchmarks-file=/tmp/benchmarks-inverse_throughput-onefull.yaml -analysis-clusters-output-file="" -analysis-inconsistencies-output-file=/tmp/clusters-old.html no exegesis target for x86_64-unknown-linux-gnu, using default Parsed 14656 benchmark points Printing sched class consistency analysis results to file '/tmp/clusters-old.html' ... no exegesis target for x86_64-unknown-linux-gnu, using default Parsed 14656 benchmark points Printing sched class consistency analysis results to file '/tmp/clusters-old.html' Performance counter stats for './bin/llvm-exegesis -mode=analysis -analysis-epsilon=1.0 -benchmarks-file=/tmp/benchmarks-inverse_throughput-onefull.yaml -analysis-clusters-output-file= -analysis-inconsistencies-output-file=/tmp/clusters-old.html' (9 runs): 9465.46 msec task-clock # 1.000 CPUs utilized ( +- 0.05% ) 60 context-switches # 6.363 M/sec ( +- 79.45% ) 0 cpu-migrations # 0.000 K/sec 11364 page-faults # 1200.697 M/sec ( +- 0.60% ) 37935623543 cycles # 4008083.912 GHz ( +- 0.05% ) (83.32%) 2371625356 stalled-cycles-frontend # 6.25% frontend cycles idle ( +- 0.37% ) (83.32%) 8476077875 stalled-cycles-backend # 22.34% backend cycles idle ( +- 0.18% ) (33.36%) 41822439158 instructions # 1.10 insn per cycle # 0.20 stalled cycles per insn ( +- 0.02% ) (50.03%) 11607658944 branches # 1226405861.486 M/sec ( +- 0.01% ) (66.69%) 210864633 branch-misses # 1.82% of all branches ( +- 0.06% ) (83.34%) 9.46636 +- 0.00441 seconds time elapsed ( +- 0.05% ) ``` ``` $ perf stat -r 9 ./bin/llvm-exegesis -mode=analysis -analysis-epsilon=1.0 -benchmarks-file=/tmp/benchmarks-inverse_throughput-onefull.yaml -analysis-clusters-output-file="" -analysis-inconsistencies-output-file=/tmp/clusters-bew.html no exegesis target for x86_64-unknown-linux-gnu, using default Parsed 14656 benchmark points Printing sched class consistency analysis results to file '/tmp/clusters-bew.html' ... no exegesis target for x86_64-unknown-linux-gnu, using default Parsed 14656 benchmark points Printing sched class consistency analysis results to file '/tmp/clusters-bew.html' Performance counter stats for './bin/llvm-exegesis -mode=analysis -analysis-epsilon=1.0 -benchmarks-file=/tmp/benchmarks-inverse_throughput-onefull.yaml -analysis-clusters-output-file= -analysis-inconsistencies-output-file=/tmp/clusters-bew.html' (9 runs): 1480.66 msec task-clock # 1.000 CPUs utilized ( +- 0.19% ) 13 context-switches # 8.483 M/sec ( +- 83.10% ) 0 cpu-migrations # 0.075 M/sec ( +-100.00% ) 11596 page-faults # 7834.247 M/sec ( +- 0.59% ) 5933732194 cycles # 4008977.535 GHz ( +- 0.19% ) (83.22%) 438111928 stalled-cycles-frontend # 7.38% frontend cycles idle ( +- 0.37% ) (83.25%) 1454969705 stalled-cycles-backend # 24.52% backend cycles idle ( +- 0.94% ) (33.53%) 7724218604 instructions # 1.30 insn per cycle # 0.19 stalled cycles per insn ( +- 0.07% ) (50.14%) 1979796413 branches # 1337599858.945 M/sec ( +- 0.06% ) (66.74%) 32641638 branch-misses # 1.65% of all branches ( +- 0.18% ) (83.31%) 1.48128 +- 0.00284 seconds time elapsed ( +- 0.19% ) $ sha512sum /tmp/clusters-* db4bbd904fe8840853b589b032c5041bc060b91bcd9c27b914b56581fbc473550eea74b852238c79963b5adf2419f379e9f5db76784048b48e3937f9f3e732bf /tmp/clusters-bew.html db4bbd904fe8840853b589b032c5041bc060b91bcd9c27b914b56581fbc473550eea74b852238c79963b5adf2419f379e9f5db76784048b48e3937f9f3e732bf /tmp/clusters-old.html ``` Reviewers: courbet, gchatelet Reviewed By: courbet Subscribers: tschuett, llvm-commits, RKSimon Tags: #llvm Differential Revision: https://reviews.llvm.org/D57657 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353024 91177308-0d34-0410-b5e6-96231b3b80d8 Roman Lebedev 1 year, 9 months ago
1 changed file(s) with 18 addition(s) and 6 deletion(s). Raw diff Collapse all Expand all
88 #include "BenchmarkResult.h"
99 #include "BenchmarkRunner.h"
1010 #include "llvm/ADT/STLExtras.h"
11 #include "llvm/ADT/StringMap.h"
12 #include "llvm/ADT/StringRef.h"
1113 #include "llvm/ADT/bit.h"
12 #include "llvm/ADT/StringRef.h"
1314 #include "llvm/ObjectYAML/YAML.h"
1415 #include "llvm/Support/FileOutputBuffer.h"
1516 #include "llvm/Support/FileSystem.h"
2829 // serialization process to encode/decode registers and instructions.
2930 struct YamlContext {
3031 YamlContext(const exegesis::LLVMState &State)
31 : State(&State), ErrorStream(LastError) {}
32 : State(&State), ErrorStream(LastError),
33 OpcodeNameToOpcodeIdx(
34 generateOpcodeNameToOpcodeIdxMapping(State.getInstrInfo())) {}
35
36 static llvm::StringMap
37 generateOpcodeNameToOpcodeIdxMapping(const llvm::MCInstrInfo &InstrInfo) {
38 llvm::StringMap Map(InstrInfo.getNumOpcodes());
39 for (unsigned I = 0, E = InstrInfo.getNumOpcodes(); I < E; ++I)
40 Map[InstrInfo.getName(I)] = I;
41 assert(Map.size() == InstrInfo.getNumOpcodes() && "Size prediction failed");
42 return Map;
43 };
3244
3345 void serializeMCInst(const llvm::MCInst &MCInst, llvm::raw_ostream &OS) {
3446 OS << getInstrName(MCInst.getOpcode());
135147 }
136148
137149 unsigned getInstrOpcode(llvm::StringRef InstrName) {
138 const llvm::MCInstrInfo &InstrInfo = State->getInstrInfo();
139 for (unsigned E = InstrInfo.getNumOpcodes(), I = 0; I < E; ++I)
140 if (InstrInfo.getName(I) == InstrName)
141 return I;
150 auto Iter = OpcodeNameToOpcodeIdx.find(InstrName);
151 if (Iter != OpcodeNameToOpcodeIdx.end())
152 return Iter->second;
142153 ErrorStream << "No opcode with name " << InstrName;
143154 return 0;
144155 }
146157 const llvm::exegesis::LLVMState *State;
147158 std::string LastError;
148159 llvm::raw_string_ostream ErrorStream;
160 const llvm::StringMap OpcodeNameToOpcodeIdx;
149161 };
150162 } // namespace
151163