[llvm] 1dd4a6a - [NFC][llvm-exegesis] `BenchmarkRunner`: split `runConfiguration()` into `getRunnableConfiguration()` + `runConfiguration()`

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 17 17:23:43 PST 2022


Author: Roman Lebedev
Date: 2022-12-18T04:23:20+03:00
New Revision: 1dd4a6aac6498c6ebdcfcc3da0beb440e4650b20

URL: https://github.com/llvm/llvm-project/commit/1dd4a6aac6498c6ebdcfcc3da0beb440e4650b20
DIFF: https://github.com/llvm/llvm-project/commit/1dd4a6aac6498c6ebdcfcc3da0beb440e4650b20.diff

LOG: [NFC][llvm-exegesis] `BenchmarkRunner`: split `runConfiguration()` into `getRunnableConfiguration()` + `runConfiguration()`

We can run as many `getRunnableConfiguration()` in parallel as we want,
but `runConfiguration()` must be run *completely* standalone from everything.
This is a step towards enabling threading.

Added: 
    

Modified: 
    llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
    llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
    llvm/tools/llvm-exegesis/llvm-exegesis.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
index db7d49f6c248..eb90f4339ec6 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp
@@ -150,10 +150,15 @@ Expected<SmallString<0>> BenchmarkRunner::assembleSnippet(
   return Buffer;
 }
 
-Expected<InstructionBenchmark> BenchmarkRunner::runConfiguration(
-    const BenchmarkCode &BC, unsigned NumRepetitions, unsigned LoopBodySize,
-    const SnippetRepetitor &Repetitor, bool DumpObjectToDisk) const {
-  InstructionBenchmark InstrBenchmark;
+Expected<BenchmarkRunner::RunnableConfiguration>
+BenchmarkRunner::getRunnableConfiguration(const BenchmarkCode &BC,
+                                          unsigned NumRepetitions,
+                                          unsigned LoopBodySize,
+                                          const SnippetRepetitor &Repetitor,
+                                          bool DumpObjectToDisk) const {
+  RunnableConfiguration RC;
+
+  InstructionBenchmark &InstrBenchmark = RC.InstrBenchmark;
   InstrBenchmark.Mode = Mode;
   InstrBenchmark.CpuName = std::string(State.getTargetMachine().getTargetCPU());
   InstrBenchmark.LLVMTriple =
@@ -183,7 +188,6 @@ Expected<InstructionBenchmark> BenchmarkRunner::runConfiguration(
 
   // Assemble NumRepetitions instructions repetitions of the snippet for
   // measurements.
-  object::OwningBinary<object::ObjectFile> ObjectFile;
   {
     auto Snippet = assembleSnippet(BC, Repetitor, InstrBenchmark.NumRepetitions,
                                    LoopBodySize);
@@ -193,18 +197,26 @@ Expected<InstructionBenchmark> BenchmarkRunner::runConfiguration(
       auto ObjectFilePath = writeObjectFile(*Snippet);
       if (Error E = ObjectFilePath.takeError()) {
         InstrBenchmark.Error = toString(std::move(E));
-        return InstrBenchmark;
+        return std::move(RC);
       }
       outs() << "Check generated assembly with: /usr/bin/objdump -d "
              << *ObjectFilePath << "\n";
     }
-    ObjectFile = getObjectFromBuffer(*Snippet);
+    RC.ObjectFile = getObjectFromBuffer(*Snippet);
   }
 
+  return std::move(RC);
+}
+
+Expected<InstructionBenchmark>
+BenchmarkRunner::runConfiguration(RunnableConfiguration &&RC) const {
+  InstructionBenchmark &InstrBenchmark = RC.InstrBenchmark;
+  object::OwningBinary<object::ObjectFile> &ObjectFile = RC.ObjectFile;
+
   if (BenchmarkSkipMeasurements) {
     InstrBenchmark.Error =
         "in --skip-measurements mode, actual measurements skipped.";
-    return InstrBenchmark;
+    return std::move(InstrBenchmark);
   }
 
   const FunctionExecutorImpl Executor(State, std::move(ObjectFile),
@@ -214,19 +226,20 @@ Expected<InstructionBenchmark> BenchmarkRunner::runConfiguration(
     if (!E.isA<SnippetCrash>())
       return std::move(E);
     InstrBenchmark.Error = toString(std::move(E));
-    return InstrBenchmark;
+    return std::move(InstrBenchmark);
   }
   assert(InstrBenchmark.NumRepetitions > 0 && "invalid NumRepetitions");
   for (BenchmarkMeasure &BM : *NewMeasurements) {
     // Scale the measurements by instruction.
     BM.PerInstructionValue /= InstrBenchmark.NumRepetitions;
     // Scale the measurements by snippet.
-    BM.PerSnippetValue *= static_cast<double>(Instructions.size()) /
-                          InstrBenchmark.NumRepetitions;
+    BM.PerSnippetValue *=
+        static_cast<double>(InstrBenchmark.Key.Instructions.size()) /
+        InstrBenchmark.NumRepetitions;
   }
   InstrBenchmark.Measurements = std::move(*NewMeasurements);
 
-  return InstrBenchmark;
+  return std::move(InstrBenchmark);
 }
 
 Expected<std::string> BenchmarkRunner::writeObjectFile(StringRef Buffer) const {

diff  --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
index dd935c32b5ae..5bd9bc25f186 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h
@@ -40,10 +40,32 @@ class BenchmarkRunner {
 
   virtual ~BenchmarkRunner();
 
+  class RunnableConfiguration {
+    friend class BenchmarkRunner;
+
+  public:
+    ~RunnableConfiguration() = default;
+    RunnableConfiguration(RunnableConfiguration &&) = default;
+
+    RunnableConfiguration(const RunnableConfiguration &) = delete;
+    RunnableConfiguration &operator=(RunnableConfiguration &&) = delete;
+    RunnableConfiguration &operator=(const RunnableConfiguration &) = delete;
+
+  private:
+    RunnableConfiguration() = default;
+
+    InstructionBenchmark InstrBenchmark;
+    object::OwningBinary<object::ObjectFile> ObjectFile;
+  };
+
+  Expected<RunnableConfiguration>
+  getRunnableConfiguration(const BenchmarkCode &Configuration,
+                           unsigned NumRepetitions, unsigned LoopUnrollFactor,
+                           const SnippetRepetitor &Repetitor,
+                           bool DumpObjectToDisk) const;
+
   Expected<InstructionBenchmark>
-  runConfiguration(const BenchmarkCode &Configuration, unsigned NumRepetitions,
-                   unsigned LoopUnrollFactor, const SnippetRepetitor &Repetitor,
-                   bool DumpObjectToDisk) const;
+  runConfiguration(RunnableConfiguration &&RC) const;
 
   // Scratch space to run instructions that touch memory.
   struct ScratchSpace {

diff  --git a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
index e74fb155d944..02d3b90871f6 100644
--- a/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
+++ b/llvm/tools/llvm-exegesis/llvm-exegesis.cpp
@@ -421,8 +421,10 @@ void benchmarkMain() {
 
     for (const std::unique_ptr<const SnippetRepetitor> &Repetitor :
          Repetitors) {
-      AllResults.emplace_back(ExitOnErr(Runner->runConfiguration(
-          Conf, NumRepetitions, LoopBodySize, *Repetitor, DumpObjectToDisk)));
+      auto RC = ExitOnErr(Runner->getRunnableConfiguration(
+          Conf, NumRepetitions, LoopBodySize, *Repetitor, DumpObjectToDisk));
+      AllResults.emplace_back(
+          ExitOnErr(Runner->runConfiguration(std::move(RC))));
     }
     InstructionBenchmark &Result = AllResults.front();
 


        


More information about the llvm-commits mailing list