Skip to content

Commit 93db5b7

Browse files
[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.
1 parent 0c1f620 commit 93db5b7

File tree

3 files changed

+59
-49
lines changed

3 files changed

+59
-49
lines changed

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

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -193,55 +193,12 @@ template <> struct SequenceElementTraits<exegesis::BenchmarkMeasure> {
193193
static const bool flow = false;
194194
};
195195

196-
const char *validationEventToString(exegesis::ValidationEvent VE) {
197-
switch (VE) {
198-
case exegesis::ValidationEvent::InstructionRetired:
199-
return "instructions-retired";
200-
case exegesis::ValidationEvent::L1DCacheLoadMiss:
201-
return "l1d-cache-load-misses";
202-
case exegesis::ValidationEvent::L1DCacheStoreMiss:
203-
return "l1d-cache-store-misses";
204-
case exegesis::ValidationEvent::L1ICacheLoadMiss:
205-
return "l1i-cache-load-misses";
206-
case exegesis::ValidationEvent::DataTLBLoadMiss:
207-
return "data-tlb-load-misses";
208-
case exegesis::ValidationEvent::DataTLBStoreMiss:
209-
return "data-tlb-store-misses";
210-
case exegesis::ValidationEvent::InstructionTLBLoadMiss:
211-
return "instruction-tlb-load-misses";
212-
case exegesis::ValidationEvent::BranchPredictionMiss:
213-
return "branch-prediction-misses";
214-
}
215-
llvm_unreachable("Unhandled exegesis::ValidationEvent enum");
216-
}
217-
218-
Expected<exegesis::ValidationEvent> stringToValidationEvent(StringRef Input) {
219-
if (Input == "instructions-retired")
220-
return exegesis::ValidationEvent::InstructionRetired;
221-
else if (Input == "l1d-cache-load-misses")
222-
return exegesis::ValidationEvent::L1DCacheLoadMiss;
223-
else if (Input == "l1d-cache-store-misses")
224-
return exegesis::ValidationEvent::L1DCacheStoreMiss;
225-
else if (Input == "l1i-cache-load-misses")
226-
return exegesis::ValidationEvent::L1ICacheLoadMiss;
227-
else if (Input == "data-tlb-load-misses")
228-
return exegesis::ValidationEvent::DataTLBLoadMiss;
229-
else if (Input == "data-tlb-store-misses")
230-
return exegesis::ValidationEvent::DataTLBStoreMiss;
231-
else if (Input == "instruction-tlb-load-misses")
232-
return exegesis::ValidationEvent::InstructionTLBLoadMiss;
233-
else if (Input == "branch-prediction-misses")
234-
return exegesis::ValidationEvent::BranchPredictionMiss;
235-
else
236-
return make_error<StringError>("Invalid validation event string",
237-
errc::invalid_argument);
238-
}
239-
240196
template <>
241197
struct CustomMappingTraits<std::map<exegesis::ValidationEvent, int64_t>> {
242198
static void inputOne(IO &Io, StringRef KeyStr,
243199
std::map<exegesis::ValidationEvent, int64_t> &VI) {
244-
Expected<exegesis::ValidationEvent> Key = stringToValidationEvent(KeyStr);
200+
Expected<exegesis::ValidationEvent> Key =
201+
exegesis::stringToValidationEvent(KeyStr);
245202
if (!Key) {
246203
Io.setError("Key is not a valid validation event");
247204
return;
@@ -251,7 +208,7 @@ struct CustomMappingTraits<std::map<exegesis::ValidationEvent, int64_t>> {
251208

252209
static void output(IO &Io, std::map<exegesis::ValidationEvent, int64_t> &VI) {
253210
for (auto &IndividualVI : VI) {
254-
Io.mapRequired(validationEventToString(IndividualVI.first),
211+
Io.mapRequired(exegesis::validationEventToString(IndividualVI.first),
255212
IndividualVI.second);
256213
}
257214
}
@@ -484,6 +441,49 @@ bool operator==(const BenchmarkMeasure &A, const BenchmarkMeasure &B) {
484441
std::tie(B.Key, B.PerInstructionValue, B.PerSnippetValue);
485442
}
486443

444+
const char *validationEventToString(ValidationEvent VE) {
445+
switch (VE) {
446+
case exegesis::ValidationEvent::InstructionRetired:
447+
return "instructions-retired";
448+
case exegesis::ValidationEvent::L1DCacheLoadMiss:
449+
return "l1d-cache-load-misses";
450+
case exegesis::ValidationEvent::L1DCacheStoreMiss:
451+
return "l1d-cache-store-misses";
452+
case exegesis::ValidationEvent::L1ICacheLoadMiss:
453+
return "l1i-cache-load-misses";
454+
case exegesis::ValidationEvent::DataTLBLoadMiss:
455+
return "data-tlb-load-misses";
456+
case exegesis::ValidationEvent::DataTLBStoreMiss:
457+
return "data-tlb-store-misses";
458+
case exegesis::ValidationEvent::InstructionTLBLoadMiss:
459+
return "instruction-tlb-load-misses";
460+
case exegesis::ValidationEvent::BranchPredictionMiss:
461+
return "branch-prediction-misses";
462+
}
463+
llvm_unreachable("Unhandled exegesis::ValidationEvent enum");
464+
}
465+
466+
Expected<ValidationEvent> stringToValidationEvent(StringRef Input) {
467+
if (Input == "instructions-retired")
468+
return exegesis::ValidationEvent::InstructionRetired;
469+
else if (Input == "l1d-cache-load-misses")
470+
return exegesis::ValidationEvent::L1DCacheLoadMiss;
471+
else if (Input == "l1d-cache-store-misses")
472+
return exegesis::ValidationEvent::L1DCacheStoreMiss;
473+
else if (Input == "l1i-cache-load-misses")
474+
return exegesis::ValidationEvent::L1ICacheLoadMiss;
475+
else if (Input == "data-tlb-load-misses")
476+
return exegesis::ValidationEvent::DataTLBLoadMiss;
477+
else if (Input == "data-tlb-store-misses")
478+
return exegesis::ValidationEvent::DataTLBStoreMiss;
479+
else if (Input == "instruction-tlb-load-misses")
480+
return exegesis::ValidationEvent::InstructionTLBLoadMiss;
481+
else if (Input == "branch-prediction-misses")
482+
return exegesis::ValidationEvent::BranchPredictionMiss;
483+
else
484+
return make_error<StringError>("Invalid validation event string",
485+
errc::invalid_argument);
486+
}
487487

488488
} // namespace exegesis
489489
} // namespace llvm

llvm/tools/llvm-exegesis/lib/BenchmarkResult.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ enum ValidationEvent {
4343
BranchPredictionMiss
4444
};
4545

46+
const char *validationEventToString(exegesis::ValidationEvent VE);
47+
Expected<ValidationEvent> stringToValidationEvent(StringRef Input);
48+
4649
enum class BenchmarkPhaseSelectorE {
4750
PrepareSnippet,
4851
PrepareAndAssembleSnippet,

llvm/tools/llvm-exegesis/lib/LatencyBenchmarkRunner.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <algorithm>
1616
#include <cmath>
1717

18+
#define DEBUG_TYPE "exegesis-latency-benchmarkrunner"
19+
1820
namespace llvm {
1921
namespace exegesis {
2022

@@ -91,9 +93,11 @@ Expected<std::vector<BenchmarkMeasure>> LatencyBenchmarkRunner::runMeasurements(
9193
if (!ExpectedCounterValues)
9294
return ExpectedCounterValues.takeError();
9395
ValuesCount = ExpectedCounterValues.get().size();
94-
if (ValuesCount == 1)
96+
if (ValuesCount == 1) {
97+
LLVM_DEBUG(dbgs() << "Latency value: " << ExpectedCounterValues.get()[0]
98+
<< "\n");
9599
AccumulatedValues.push_back(ExpectedCounterValues.get()[0]);
96-
else {
100+
} else {
97101
// We'll keep the reading with lowest variance (ie., most stable)
98102
double Variance = computeVariance(*ExpectedCounterValues);
99103
if (MinVariance > Variance) {
@@ -102,8 +106,11 @@ Expected<std::vector<BenchmarkMeasure>> LatencyBenchmarkRunner::runMeasurements(
102106
}
103107
}
104108

105-
for (size_t I = 0; I < ValCounterValues.size(); ++I)
109+
for (size_t I = 0; I < ValCounterValues.size(); ++I) {
110+
LLVM_DEBUG(dbgs() << validationEventToString(ValidationCounters[I])
111+
<< ": " << IterationValCounterValues[I] << "\n");
106112
ValCounterValues[I] += IterationValCounterValues[I];
113+
}
107114
}
108115

109116
std::map<ValidationEvent, int64_t> ValidationInfo;

0 commit comments

Comments
 (0)