perfmon: add branch mispredictions 77/30877/9
authorRay Kinsella <mdr@ashroe.eu>
Thu, 21 Jan 2021 18:25:26 +0000 (18:25 +0000)
committerDamjan Marion <dmarion@me.com>
Wed, 31 Mar 2021 15:06:30 +0000 (15:06 +0000)
Add branches, branches taken (a meteric for branchy code), and branch
misses.

Type: improvement

Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Change-Id: If92d4aaf9d0a6e3b99b8c19e6311cc08ca470590

src/plugins/perfmon/CMakeLists.txt
src/plugins/perfmon/intel/bundle/branch_mispred.c [new file with mode: 0644]
src/plugins/perfmon/intel/core.h

index 7e400c5..e0d1d30 100644 (file)
@@ -28,4 +28,5 @@ add_vpp_plugin(perfmon
   intel/bundle/load_blocks.c
   intel/bundle/mem_bw.c
   intel/bundle/cache_hit_miss.c
+  intel/bundle/branch_mispred.c
 )
diff --git a/src/plugins/perfmon/intel/bundle/branch_mispred.c b/src/plugins/perfmon/intel/bundle/branch_mispred.c
new file mode 100644 (file)
index 0000000..343adc7
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2020 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <vnet/vnet.h>
+#include <perfmon/perfmon.h>
+#include <perfmon/intel/core.h>
+
+static u8 *
+format_branch_mispredictions (u8 *s, va_list *args)
+{
+  perfmon_node_stats_t *ns = va_arg (*args, perfmon_node_stats_t *);
+  int row = va_arg (*args, int);
+
+  switch (row)
+    {
+    case 0:
+      s = format (s, "%9.2f", ns->value[0] / (f64) ns->n_calls);
+      break;
+    case 1:
+      s = format (s, "%9.2f", ns->value[0] / (f64) ns->n_packets);
+      break;
+    case 2:
+      s = format (s, "%9.2f", ns->value[1] / (f64) ns->n_calls);
+      break;
+    case 3:
+      s = format (s, "%9.2f", ns->value[1] / (f64) ns->n_packets);
+      break;
+    case 4:
+      s = format (s, "%05.2f", (ns->value[2] / (f64) ns->value[0]) * 100);
+      break;
+    case 5:
+      s = format (s, "%9f", (f64) ns->value[0]);
+      break;
+    case 6:
+      s = format (s, "%9f", (f64) ns->value[1]);
+      break;
+    case 7:
+      s = format (s, "%9f", (f64) ns->value[2]);
+      break;
+    }
+  return s;
+}
+
+PERFMON_REGISTER_BUNDLE (branch_mispredictions) = {
+  .name = "branch-mispred",
+  .description = "Branches, branches taken and mis-predictions",
+  .source = "intel-core",
+  .type = PERFMON_BUNDLE_TYPE_NODE,
+  .events[0] = INTEL_CORE_E_BR_INST_RETIRED_ALL_BRANCHES,
+  .events[1] = INTEL_CORE_E_BR_INST_RETIRED_NEAR_TAKEN,
+  .events[2] = INTEL_CORE_E_BR_MISP_RETIRED_ALL_BRANCHES,
+  .n_events = 3,
+  .format_fn = format_branch_mispredictions,
+  .column_headers = PERFMON_STRINGS ("Branches/call", "Branches/pkt",
+                                    "Taken/call", "Taken/pkt", "% MisPred"),
+  .raw_column_headers = PERFMON_STRINGS ("branches", "taken", "misses"),
+};
index d7fd9e0..01945d2 100644 (file)
      "Number of instructions retired. General Counter - architectural event") \
   _ (0xC2, 0x02, 0, 0, 0, 0x00, UOPS_RETIRED, RETIRE_SLOTS,                   \
      "Retirement slots used.")                                                \
+  _ (0xC4, 0x00, 0, 0, 0, 0x00, BR_INST_RETIRED, ALL_BRANCHES,                \
+     "Counts all (macro) branch instructions retired.")                       \
+  _ (0xC5, 0x00, 0, 0, 0, 0x00, BR_MISP_RETIRED, ALL_BRANCHES,                \
+     "All mispredicted macro branch instructions retired.")                   \
+  _ (0xC4, 0x20, 0, 0, 0, 0x00, BR_INST_RETIRED, NEAR_TAKEN,                  \
+     "Taken branch instructions retired.")                                    \
   _ (0xD0, 0x81, 0, 0, 0, 0x00, MEM_INST_RETIRED, ALL_LOADS,                  \
      "All retired load instructions.")                                        \
   _ (0xD0, 0x82, 0, 0, 0, 0x00, MEM_INST_RETIRED, ALL_STORES,                 \