[llvm] 93db5b7 - [llvm-exegesis] Add debug option to print per-measurement values (#81219)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 19 01:41:52 PST 2024
Author: Aiden Grossman
Date: 2024-02-19T01:41:49-08:00
New Revision: 93db5b7b2561b574aae05c2ffd601cfcadc3f2c2
URL: https://github.com/llvm/llvm-project/commit/93db5b7b2561b574aae05c2ffd601cfcadc3f2c2
DIFF: https://github.com/llvm/llvm-project/commit/93db5b7b2561b574aae05c2ffd601cfcadc3f2c2.diff
LOG: [llvm-exegesis] Add debug option to print per-measurement values (#81219)
This patch adds a debug option to print per measurement latency and
validation counter values. This makes it easier to debug certain
transient issues that can be hard to spot just using the summary view at
the end.
I've hacked print statements into this part of the code base enough
times for debugging various things that I think it makes sense to be a
proper debug macro.
Added:
Modified:
llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
llvm/tools/llvm-exegesis/lib/LatencyBenchmarkRunner.cpp
Removed:
################################################################################
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
index 570af6eafb5857..189add6464173f 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp
@@ -193,55 +193,12 @@ template <> struct SequenceElementTraits<exegesis::BenchmarkMeasure> {
static const bool flow = false;
};
-const char *validationEventToString(exegesis::ValidationEvent VE) {
- switch (VE) {
- case exegesis::ValidationEvent::InstructionRetired:
- return "instructions-retired";
- case exegesis::ValidationEvent::L1DCacheLoadMiss:
- return "l1d-cache-load-misses";
- case exegesis::ValidationEvent::L1DCacheStoreMiss:
- return "l1d-cache-store-misses";
- case exegesis::ValidationEvent::L1ICacheLoadMiss:
- return "l1i-cache-load-misses";
- case exegesis::ValidationEvent::DataTLBLoadMiss:
- return "data-tlb-load-misses";
- case exegesis::ValidationEvent::DataTLBStoreMiss:
- return "data-tlb-store-misses";
- case exegesis::ValidationEvent::InstructionTLBLoadMiss:
- return "instruction-tlb-load-misses";
- case exegesis::ValidationEvent::BranchPredictionMiss:
- return "branch-prediction-misses";
- }
- llvm_unreachable("Unhandled exegesis::ValidationEvent enum");
-}
-
-Expected<exegesis::ValidationEvent> stringToValidationEvent(StringRef Input) {
- if (Input == "instructions-retired")
- return exegesis::ValidationEvent::InstructionRetired;
- else if (Input == "l1d-cache-load-misses")
- return exegesis::ValidationEvent::L1DCacheLoadMiss;
- else if (Input == "l1d-cache-store-misses")
- return exegesis::ValidationEvent::L1DCacheStoreMiss;
- else if (Input == "l1i-cache-load-misses")
- return exegesis::ValidationEvent::L1ICacheLoadMiss;
- else if (Input == "data-tlb-load-misses")
- return exegesis::ValidationEvent::DataTLBLoadMiss;
- else if (Input == "data-tlb-store-misses")
- return exegesis::ValidationEvent::DataTLBStoreMiss;
- else if (Input == "instruction-tlb-load-misses")
- return exegesis::ValidationEvent::InstructionTLBLoadMiss;
- else if (Input == "branch-prediction-misses")
- return exegesis::ValidationEvent::BranchPredictionMiss;
- else
- return make_error<StringError>("Invalid validation event string",
- errc::invalid_argument);
-}
-
template <>
struct CustomMappingTraits<std::map<exegesis::ValidationEvent, int64_t>> {
static void inputOne(IO &Io, StringRef KeyStr,
std::map<exegesis::ValidationEvent, int64_t> &VI) {
- Expected<exegesis::ValidationEvent> Key = stringToValidationEvent(KeyStr);
+ Expected<exegesis::ValidationEvent> Key =
+ exegesis::stringToValidationEvent(KeyStr);
if (!Key) {
Io.setError("Key is not a valid validation event");
return;
@@ -251,7 +208,7 @@ struct CustomMappingTraits<std::map<exegesis::ValidationEvent, int64_t>> {
static void output(IO &Io, std::map<exegesis::ValidationEvent, int64_t> &VI) {
for (auto &IndividualVI : VI) {
- Io.mapRequired(validationEventToString(IndividualVI.first),
+ Io.mapRequired(exegesis::validationEventToString(IndividualVI.first),
IndividualVI.second);
}
}
@@ -484,6 +441,49 @@ bool operator==(const BenchmarkMeasure &A, const BenchmarkMeasure &B) {
std::tie(B.Key, B.PerInstructionValue, B.PerSnippetValue);
}
+const char *validationEventToString(ValidationEvent VE) {
+ switch (VE) {
+ case exegesis::ValidationEvent::InstructionRetired:
+ return "instructions-retired";
+ case exegesis::ValidationEvent::L1DCacheLoadMiss:
+ return "l1d-cache-load-misses";
+ case exegesis::ValidationEvent::L1DCacheStoreMiss:
+ return "l1d-cache-store-misses";
+ case exegesis::ValidationEvent::L1ICacheLoadMiss:
+ return "l1i-cache-load-misses";
+ case exegesis::ValidationEvent::DataTLBLoadMiss:
+ return "data-tlb-load-misses";
+ case exegesis::ValidationEvent::DataTLBStoreMiss:
+ return "data-tlb-store-misses";
+ case exegesis::ValidationEvent::InstructionTLBLoadMiss:
+ return "instruction-tlb-load-misses";
+ case exegesis::ValidationEvent::BranchPredictionMiss:
+ return "branch-prediction-misses";
+ }
+ llvm_unreachable("Unhandled exegesis::ValidationEvent enum");
+}
+
+Expected<ValidationEvent> stringToValidationEvent(StringRef Input) {
+ if (Input == "instructions-retired")
+ return exegesis::ValidationEvent::InstructionRetired;
+ else if (Input == "l1d-cache-load-misses")
+ return exegesis::ValidationEvent::L1DCacheLoadMiss;
+ else if (Input == "l1d-cache-store-misses")
+ return exegesis::ValidationEvent::L1DCacheStoreMiss;
+ else if (Input == "l1i-cache-load-misses")
+ return exegesis::ValidationEvent::L1ICacheLoadMiss;
+ else if (Input == "data-tlb-load-misses")
+ return exegesis::ValidationEvent::DataTLBLoadMiss;
+ else if (Input == "data-tlb-store-misses")
+ return exegesis::ValidationEvent::DataTLBStoreMiss;
+ else if (Input == "instruction-tlb-load-misses")
+ return exegesis::ValidationEvent::InstructionTLBLoadMiss;
+ else if (Input == "branch-prediction-misses")
+ return exegesis::ValidationEvent::BranchPredictionMiss;
+ else
+ return make_error<StringError>("Invalid validation event string",
+ errc::invalid_argument);
+}
} // namespace exegesis
} // namespace llvm
diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
index c5d7bd23a41d42..60115c51bba321 100644
--- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
+++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.h
@@ -43,6 +43,9 @@ enum ValidationEvent {
BranchPredictionMiss
};
+const char *validationEventToString(exegesis::ValidationEvent VE);
+Expected<ValidationEvent> stringToValidationEvent(StringRef Input);
+
enum class BenchmarkPhaseSelectorE {
PrepareSnippet,
PrepareAndAssembleSnippet,
diff --git a/llvm/tools/llvm-exegesis/lib/LatencyBenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/LatencyBenchmarkRunner.cpp
index 633740494e33e7..a9917a29cce24d 100644
--- a/llvm/tools/llvm-exegesis/lib/LatencyBenchmarkRunner.cpp
+++ b/llvm/tools/llvm-exegesis/lib/LatencyBenchmarkRunner.cpp
@@ -15,6 +15,8 @@
#include <algorithm>
#include <cmath>
+#define DEBUG_TYPE "exegesis-latency-benchmarkrunner"
+
namespace llvm {
namespace exegesis {
@@ -91,9 +93,11 @@ Expected<std::vector<BenchmarkMeasure>> LatencyBenchmarkRunner::runMeasurements(
if (!ExpectedCounterValues)
return ExpectedCounterValues.takeError();
ValuesCount = ExpectedCounterValues.get().size();
- if (ValuesCount == 1)
+ if (ValuesCount == 1) {
+ LLVM_DEBUG(dbgs() << "Latency value: " << ExpectedCounterValues.get()[0]
+ << "\n");
AccumulatedValues.push_back(ExpectedCounterValues.get()[0]);
- else {
+ } else {
// We'll keep the reading with lowest variance (ie., most stable)
double Variance = computeVariance(*ExpectedCounterValues);
if (MinVariance > Variance) {
@@ -102,8 +106,11 @@ Expected<std::vector<BenchmarkMeasure>> LatencyBenchmarkRunner::runMeasurements(
}
}
- for (size_t I = 0; I < ValCounterValues.size(); ++I)
+ for (size_t I = 0; I < ValCounterValues.size(); ++I) {
+ LLVM_DEBUG(dbgs() << validationEventToString(ValidationCounters[I])
+ << ": " << IterationValCounterValues[I] << "\n");
ValCounterValues[I] += IterationValCounterValues[I];
+ }
}
std::map<ValidationEvent, int64_t> ValidationInfo;
More information about the llvm-commits
mailing list