@@ -18,29 +18,32 @@ SkylakeTopdown::SkylakeTopdown(IntelTopdownLevel level)
18
18
" ,UOPS_ISSUED:ANY"
19
19
" ,UOPS_RETIRED:RETIRE_SLOTS"
20
20
" ,INT_MISC:RECOVERY_CYCLES"
21
- " ,CPU_CLK_UNHALTED:THREAD " ,
21
+ " ,CPU_CLK_UNHALTED:THREAD_P " ,
22
22
// all_counters
23
23
" IDQ_UOPS_NOT_DELIVERED:CORE"
24
24
" ,UOPS_ISSUED:ANY"
25
25
" ,UOPS_RETIRED:RETIRE_SLOTS"
26
26
" ,INT_MISC:RECOVERY_CYCLES"
27
- " ,CPU_CLK_UNHALTED:THREAD "
27
+ " ,CPU_CLK_UNHALTED:THREAD_P "
28
28
" ,IDQ_UOPS_NOT_DELIVERED:CYCLES_0_UOPS_DELIV_CORE"
29
29
" ,BR_MISP_RETIRED:ALL_BRANCHES"
30
30
" ,MACHINE_CLEARS:COUNT"
31
31
" ,CYCLE_ACTIVITY:STALLS_MEM_ANY"
32
32
" ,EXE_ACTIVITY:BOUND_ON_STORES"
33
33
" ,CYCLE_ACTIVITY:STALLS_TOTAL"
34
34
" ,EXE_ACTIVITY:1_PORTS_UTIL"
35
- " ,EXE_ACTIVITY:2_PORTS_UTIL"
36
- " ,UOPS_RETIRED:MACRO_FUSED"
37
- " ,INST_RETIRED:ANY" ,
35
+ " ,EXE_ACTIVITY:2_PORTS_UTIL" ,
36
+ // Note: PAPI doesn't seem to have UOPS_RETIRED.MACRO_FUSED,
37
+ // so we can't currently calculate L2 metrics under retiring.
38
+ // The commented counters below are unique to these metrics.
39
+ // ",UOPS_RETIRED:MACRO_FUSED"
40
+ // ",INST_RETIRED:ANY_P"
38
41
// res_top
39
42
{ " retiring" , " backend_bound" , " frontend_bound" , " bad_speculation" },
40
43
// res_all
41
44
{ " retiring" ,
42
- " light_operations" ,
43
- " heavy_operations" ,
45
+ // "light_operations",
46
+ // "heavy_operations",
44
47
" backend_bound" ,
45
48
" memory_bound" ,
46
49
" core_bound" ,
@@ -73,7 +76,7 @@ std::vector<Entry> SkylakeTopdown::compute_toplevel(const std::vector<Entry>& re
73
76
Variant v_uops_issued_any = get_val_from_rec (rec, " UOPS_ISSUED:ANY" );
74
77
Variant v_uops_retired_retire_slots = get_val_from_rec (rec, " UOPS_RETIRED:RETIRE_SLOTS" );
75
78
Variant v_int_misc_recovery_cycles = get_val_from_rec (rec, " INT_MISC:RECOVERY_CYCLES" );
76
- Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD " );
79
+ Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD_P " );
77
80
78
81
bool is_incomplete = v_idq_uops_not_delivered_core.empty () || v_uops_issued_any.empty ()
79
82
|| v_uops_retired_retire_slots.empty () || v_int_misc_recovery_cycles.empty ()
@@ -119,40 +122,43 @@ std::size_t SkylakeTopdown::get_num_expected_toplevel() const
119
122
std::vector<Entry> SkylakeTopdown::compute_retiring (const std::vector<Entry>& rec)
120
123
{
121
124
std::vector<Entry> ret;
125
+
126
+ // TODO uncomment when we can figure out the raw counter corresponding to
127
+ // UOPS_RETIRED:MACRO_FUSED
122
128
123
- Variant v_uops_retired_retire_slots = get_val_from_rec (rec, " UOPS_RETIRED:RETIRE_SLOTS" );
124
- Variant v_uops_retired_macro_fused = get_val_from_rec (rec, " UOPS_RETIRED:MACRO_FUSED" );
125
- Variant v_inst_retired_any = get_val_from_rec (rec, " INST_RETIRED:ANY " );
126
- Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD " );
129
+ // Variant v_uops_retired_retire_slots = get_val_from_rec(rec, "UOPS_RETIRED:RETIRE_SLOTS");
130
+ // Variant v_uops_retired_macro_fused = get_val_from_rec(rec, "UOPS_RETIRED:MACRO_FUSED");
131
+ // Variant v_inst_retired_any = get_val_from_rec(rec, "INST_RETIRED:ANY_P ");
132
+ // Variant v_cpu_clk_unhalted_thread = get_val_from_rec(rec, "CPU_CLK_UNHALTED:THREAD_P ");
127
133
128
- bool is_incomplete = v_uops_retired_retire_slots.empty () || v_uops_retired_macro_fused.empty ()
129
- || v_inst_retired_any.empty () || v_cpu_clk_unhalted_thread.empty ();
134
+ // bool is_incomplete = v_uops_retired_retire_slots.empty() || v_uops_retired_macro_fused.empty()
135
+ // || v_inst_retired_any.empty() || v_cpu_clk_unhalted_thread.empty();
130
136
131
- double thread_slots = 4 * v_cpu_clk_unhalted_thread.to_double ();
137
+ // double thread_slots = 4 * v_cpu_clk_unhalted_thread.to_double();
132
138
133
- if (is_incomplete || !(thread_slots > 1.0 )) {
134
- return ret;
135
- }
139
+ // if (is_incomplete || !(thread_slots > 1.0)) {
140
+ // return ret;
141
+ // }
136
142
137
- double retiring = std::max (v_uops_retired_retire_slots.to_double () / thread_slots, 0.0 );
143
+ // double retiring = std::max(v_uops_retired_retire_slots.to_double() / thread_slots, 0.0);
138
144
139
- double heavy_operations = std::max (
140
- (v_uops_retired_retire_slots.to_double () + v_uops_retired_macro_fused.to_double ()
141
- - v_inst_retired_any.to_double ())
142
- / thread_slots,
143
- 0.0
144
- );
145
+ // double heavy_operations = std::max(
146
+ // (v_uops_retired_retire_slots.to_double() + v_uops_retired_macro_fused.to_double()
147
+ // - v_inst_retired_any.to_double())
148
+ // / thread_slots,
149
+ // 0.0
150
+ // );
145
151
146
- ret.reserve (2 );
147
- ret.push_back (Entry (m_result_attrs[" heavy_operations" ], Variant (heavy_operations)));
148
- ret.push_back (Entry (m_result_attrs[" light_operations" ], Variant (std::max (retiring - heavy_operations, 0.0 ))));
152
+ // ret.reserve(2);
153
+ // ret.push_back(Entry(m_result_attrs["heavy_operations"], Variant(heavy_operations)));
154
+ // ret.push_back(Entry(m_result_attrs["light_operations"], Variant(std::max(retiring - heavy_operations, 0.0))));
149
155
150
156
return ret;
151
157
}
152
158
153
159
std::size_t SkylakeTopdown::get_num_expected_retiring () const
154
160
{
155
- return 2 ;
161
+ return 0 ;
156
162
}
157
163
158
164
std::vector<Entry> SkylakeTopdown::compute_backend_bound (const std::vector<Entry>& rec)
@@ -169,7 +175,7 @@ std::vector<Entry> SkylakeTopdown::compute_backend_bound(const std::vector<Entry
169
175
Variant v_uops_issued_any = get_val_from_rec (rec, " UOPS_ISSUED:ANY" );
170
176
Variant v_uops_retired_retire_slots = get_val_from_rec (rec, " UOPS_RETIRED:RETIRE_SLOTS" );
171
177
Variant v_int_misc_recovery_cycles = get_val_from_rec (rec, " INT_MISC:RECOVERY_CYCLES" );
172
- Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD " );
178
+ Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD_P " );
173
179
174
180
bool is_incomplete = v_idq_uops_not_delivered_core.empty () || v_uops_issued_any.empty ()
175
181
|| v_uops_retired_retire_slots.empty () || v_int_misc_recovery_cycles.empty ()
@@ -220,7 +226,7 @@ std::vector<Entry> SkylakeTopdown::compute_frontend_bound(const std::vector<Entr
220
226
Variant v_idq_uops_not_delivered_cycles_0_uops_deliv_core =
221
227
get_val_from_rec (rec, " IDQ_UOPS_NOT_DELIVERED:CYCLES_0_UOPS_DELIV_CORE" );
222
228
Variant v_idq_uops_not_delivered_core = get_val_from_rec (rec, " IDQ_UOPS_NOT_DELIVERED:CORE" );
223
- Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD " );
229
+ Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD_P " );
224
230
225
231
bool is_incomplete = v_idq_uops_not_delivered_cycles_0_uops_deliv_core.empty ()
226
232
|| v_idq_uops_not_delivered_core.empty () || v_cpu_clk_unhalted_thread.empty ();
@@ -257,7 +263,7 @@ std::vector<Entry> SkylakeTopdown::compute_bad_speculation(const std::vector<Ent
257
263
Variant v_uops_issued_any = get_val_from_rec (rec, " UOPS_ISSUED:ANY" );
258
264
Variant v_uops_retired_retire_slots = get_val_from_rec (rec, " UOPS_RETIRED:RETIRE_SLOTS" );
259
265
Variant v_int_misc_recovery_cycles = get_val_from_rec (rec, " INT_MISC:RECOVERY_CYCLES" );
260
- Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD " );
266
+ Variant v_cpu_clk_unhalted_thread = get_val_from_rec (rec, " CPU_CLK_UNHALTED:THREAD_P " );
261
267
262
268
bool is_incomplete = v_br_misp_retired_all_branches.empty () || v_machine_clears_count.empty ()
263
269
|| v_uops_issued_any.empty () || v_uops_retired_retire_slots.empty ()
0 commit comments