Skip to content

Commit 7da7695

Browse files
[llvm-exegesis] Add additional validation counters (#76788)
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 3ea92ea commit 7da7695

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)