[PATCH] D57657: [llvm-exegesis] Cut run time of analysis mode by -84% (*sic*) (YamlContext::getInstrOpcode())

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 3 09:42:24 PST 2019


lebedev.ri created this revision.
lebedev.ri added reviewers: courbet, gchatelet.
lebedev.ri added a project: LLVM.
Herald added a subscriber: tschuett.

  $ 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


Repository:
  rL LLVM

https://reviews.llvm.org/D57657

Files:
  tools/llvm-exegesis/lib/BenchmarkResult.cpp


Index: tools/llvm-exegesis/lib/BenchmarkResult.cpp
===================================================================
--- tools/llvm-exegesis/lib/BenchmarkResult.cpp
+++ tools/llvm-exegesis/lib/BenchmarkResult.cpp
@@ -9,8 +9,9 @@
 #include "BenchmarkResult.h"
 #include "BenchmarkRunner.h"
 #include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/bit.h"
+#include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/bit.h"
 #include "llvm/ObjectYAML/YAML.h"
 #include "llvm/Support/FileOutputBuffer.h"
 #include "llvm/Support/FileSystem.h"
@@ -29,7 +30,17 @@
 // serialization process to encode/decode registers and instructions.
 struct YamlContext {
   YamlContext(const exegesis::LLVMState &State)
-      : State(&State), ErrorStream(LastError) {}
+      : State(&State), ErrorStream(LastError),
+        OpcodeNameToOpcodeIdx(generateOpcodeNameToOpcodeIdxMapping()) {}
+
+  llvm::StringMap<unsigned> generateOpcodeNameToOpcodeIdxMapping() {
+    const llvm::MCInstrInfo &InstrInfo = State->getInstrInfo();
+    llvm::StringMap<unsigned> Map(InstrInfo.getNumOpcodes());
+    for (unsigned I = 0, E = InstrInfo.getNumOpcodes(); I < E; ++I)
+      Map.insert(std::make_pair(InstrInfo.getName(I), I));
+    assert(Map.size() == InstrInfo.getNumOpcodes() && "Size prediction failed");
+    return Map;
+  };
 
   void serializeMCInst(const llvm::MCInst &MCInst, llvm::raw_ostream &OS) {
     OS << getInstrName(MCInst.getOpcode());
@@ -136,10 +147,9 @@
   }
 
   unsigned getInstrOpcode(llvm::StringRef InstrName) {
-    const llvm::MCInstrInfo &InstrInfo = State->getInstrInfo();
-    for (unsigned E = InstrInfo.getNumOpcodes(), I = 0; I < E; ++I)
-      if (InstrInfo.getName(I) == InstrName)
-        return I;
+    auto Iter = OpcodeNameToOpcodeIdx.find(InstrName);
+    if (Iter != OpcodeNameToOpcodeIdx.end())
+      return Iter->second;
     ErrorStream << "No opcode with name " << InstrName;
     return 0;
   }
@@ -147,6 +157,7 @@
   const llvm::exegesis::LLVMState *State;
   std::string LastError;
   llvm::raw_string_ostream ErrorStream;
+  const llvm::StringMap<unsigned> OpcodeNameToOpcodeIdx;
 };
 } // namespace
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57657.184962.patch
Type: text/x-patch
Size: 2152 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190203/52fca5fa/attachment.bin>


More information about the llvm-commits mailing list