Skip to content

Commit 7e562b0

Browse files
[llvm-exegesis] Add additional validation counters
This patch adds support for additional types of validation counters and also adds mappings between these new validation counter types and physical counters on the hardware for microarchitectures that I have the ability to test on.
1 parent 904b090 commit 7e562b0

File tree

5 files changed

+67
-6
lines changed

5 files changed

+67
-6
lines changed

llvm/include/llvm/Target/TargetPfmCounters.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ class ValidationEvent <int event_number> {
3636
}
3737

3838
def InstructionRetired : ValidationEvent<0>;
39+
def L1DCacheLoadMiss : ValidationEvent<1>;
40+
def L1DCacheStoreMiss : ValidationEvent<2>;
41+
def L1ICacheLoadMiss : ValidationEvent<3>;
42+
def DataTLBLoadMiss : ValidationEvent<4>;
43+
def DataTLBStoreMiss : ValidationEvent<5>;
44+
def InstructionTLBLoadMiss : ValidationEvent<6>;
45+
3946

4047
// PfmValidationCounter provides a mapping between the events that are
4148
// are interesting in regards to the snippet execution environment and

llvm/lib/Target/X86/X86PfmCounters.td

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ def : PfmCountersDefaultBinding<DefaultPfmCounters>;
1919

2020
// Intel X86 Counters.
2121
defvar DefaultIntelPfmValidationCounters = [
22-
PfmValidationCounter<InstructionRetired, "INSTRUCTIONS_RETIRED">
22+
PfmValidationCounter<InstructionRetired, "INSTRUCTIONS_RETIRED">,
23+
PfmValidationCounter<L1DCacheLoadMiss, "MEM_LOAD_UOPS_RETIRED:L1_MISS">,
24+
PfmValidationCounter<L1ICacheLoadMiss, "L1-ICACHE-LOAD-MISSES">,
25+
PfmValidationCounter<DataTLBLoadMiss, "DTLB_LOAD_MISSES:MISS_CAUSES_A_WALK">,
26+
PfmValidationCounter<DataTLBStoreMiss, "DTLB_STORE_MISSES:MISS_CAUSES_A_WALK">,
27+
PfmValidationCounter<InstructionTLBLoadMiss, "ITLB_MISSES:MISS_CAUSES_A_WALK">
2328
];
2429

2530
def PentiumPfmCounters : ProcPfmCounters {
@@ -200,7 +205,12 @@ def : PfmCountersBinding<"tigerlake", IceLakePfmCounters>;
200205

201206
// AMD X86 Counters.
202207
defvar DefaultAMDPfmValidationCounters = [
203-
PfmValidationCounter<InstructionRetired, "RETIRED_INSTRUCTIONS">
208+
PfmValidationCounter<InstructionRetired, "RETIRED_INSTRUCTIONS">,
209+
PfmValidationCounter<L1DCacheLoadMiss, "L1-DCACHE-LOAD-MISSES">,
210+
PfmValidationCounter<L1DCacheStoreMiss, "L1-DCACHE-STORE-MISSES">,
211+
PfmValidationCounter<L1ICacheLoadMiss, "L1-ICACHE-LOAD-MISSES">,
212+
PfmValidationCounter<DataTLBLoadMiss, "DTLB-LOAD-MISSES">,
213+
PfmValidationCounter<InstructionTLBLoadMiss, "ITLB-LOAD-MISSES">
204214
];
205215

206216
// Set basic counters for AMD cpus that we know libpfm4 supports.

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,37 @@ const char *validationEventToString(exegesis::ValidationEvent VE) {
197197
switch (VE) {
198198
case exegesis::ValidationEvent::InstructionRetired:
199199
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";
200212
}
201213
llvm_unreachable("Unhandled exegesis::ValidationEvent enum");
202214
}
203215

204216
Expected<exegesis::ValidationEvent> stringToValidationEvent(StringRef Input) {
205217
if (Input == "instructions-retired")
206218
return exegesis::ValidationEvent::InstructionRetired;
219+
else if (Input == "l1d-cache-load-misses")
220+
return exegesis::ValidationEvent::L1DCacheLoadMiss;
221+
else if (Input == "l1d-cache-store-misses")
222+
return exegesis::ValidationEvent::L1DCacheStoreMiss;
223+
else if (Input == "l1i-cache-load-misses")
224+
return exegesis::ValidationEvent::L1ICacheLoadMiss;
225+
else if (Input == "data-tlb-load-misses")
226+
return exegesis::ValidationEvent::DataTLBLoadMiss;
227+
else if (Input == "data-tlb-store-misses")
228+
return exegesis::ValidationEvent::DataTLBStoreMiss;
229+
else if (Input == "instruction-tlb-load-misses")
230+
return exegesis::ValidationEvent::InstructionTLBLoadMiss;
207231
else
208232
return make_error<StringError>("Invalid validation event string",
209233
errc::invalid_argument);

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,15 @@ class Error;
3232

3333
namespace exegesis {
3434

35-
enum ValidationEvent { InstructionRetired };
35+
enum ValidationEvent {
36+
InstructionRetired,
37+
L1DCacheLoadMiss,
38+
L1DCacheStoreMiss,
39+
L1ICacheLoadMiss,
40+
DataTLBLoadMiss,
41+
DataTLBStoreMiss,
42+
InstructionTLBLoadMiss
43+
};
3644

3745
enum class BenchmarkPhaseSelectorE {
3846
PrepareSnippet,

llvm/tools/llvm-exegesis/llvm-exegesis.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,21 @@ static cl::list<ValidationEvent> ValidationCounters(
274274
"The name of a validation counter to run concurrently with the main "
275275
"counter to validate benchmarking assumptions"),
276276
cl::CommaSeparated, cl::cat(BenchmarkOptions),
277-
cl::values(clEnumValN(ValidationEvent::InstructionRetired,
278-
"instructions-retired",
279-
"Count retired instructions")));
277+
cl::values(
278+
clEnumValN(ValidationEvent::InstructionRetired, "instructions-retired",
279+
"Count retired instructions"),
280+
clEnumValN(ValidationEvent::L1DCacheLoadMiss, "l1d-cache-load-misses",
281+
"Count L1D load cache misses"),
282+
clEnumValN(ValidationEvent::L1DCacheStoreMiss, "l1d-cache-store-misses",
283+
"Count L1D store cache misses"),
284+
clEnumValN(ValidationEvent::L1ICacheLoadMiss, "l1i-cache-load-misses",
285+
"Count L1I load cache misses"),
286+
clEnumValN(ValidationEvent::DataTLBLoadMiss, "data-tlb-load-misses",
287+
"Count DTLB load misses"),
288+
clEnumValN(ValidationEvent::DataTLBStoreMiss, "data-tlb-store-misses",
289+
"Count DTLB store misses"),
290+
clEnumValN(ValidationEvent::InstructionTLBLoadMiss,
291+
"instruction-tlb-load-misses", "Count ITLB load misses")));
280292

281293
static ExitOnError ExitOnErr("llvm-exegesis error: ");
282294

0 commit comments

Comments
 (0)