Mesa (master): intel/perf: create a unique list of counters

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 20 12:32:35 UTC 2020


Module: Mesa
Branch: master
Commit: 3f0c4c2afe4aa669e3f8cac668c3fb4dc359f57f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3f0c4c2afe4aa669e3f8cac668c3fb4dc359f57f

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Tue Oct  2 17:09:41 2018 +0100

intel/perf: create a unique list of counters

For a future extension we want to be able to list the counters. Our
existing sets counters might contain the same counters multiple times.
This is a side effect of the fixed OA counters in the HW. We track
thoses with a mask so that we know when a counter is available from
multiple metrics.

v2: Use BITFIELD64_BIT() (Jason)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2775>

---

 src/intel/perf/gen_perf.c         | 59 ++++++++++++++++++++++++++++++++++++++-
 src/intel/perf/gen_perf.h         |  5 ++++
 src/intel/perf/gen_perf.py        |  1 +
 src/intel/perf/gen_perf_private.h |  2 +-
 4 files changed, 65 insertions(+), 2 deletions(-)

diff --git a/src/intel/perf/gen_perf.c b/src/intel/perf/gen_perf.c
index 13ecdfb18d3..36a9e83857f 100644
--- a/src/intel/perf/gen_perf.c
+++ b/src/intel/perf/gen_perf.c
@@ -572,9 +572,64 @@ i915_get_sseu(int drm_fd, struct drm_i915_gem_context_param_sseu *sseu)
    gen_ioctl(drm_fd, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &arg);
 }
 
+static int
+compare_counters(const void *_c1, const void *_c2)
+{
+   const struct gen_perf_query_counter * const *c1 = _c1, * const *c2 = _c2;
+   return strcmp((*c1)->symbol_name, (*c2)->symbol_name);
+}
+
+static void
+build_unique_counter_list(struct gen_perf_config *perf)
+{
+   assert(perf->n_queries < 64);
+
+   struct hash_table *counters_table =
+      _mesa_hash_table_create(perf,
+                              _mesa_hash_string,
+                              _mesa_key_string_equal);
+   struct hash_entry *entry;
+   for (int q = 0; q < perf->n_queries ; q++) {
+      struct gen_perf_query_info *query = &perf->queries[q];
+
+      for (int c = 0; c < query->n_counters; c++) {
+         struct gen_perf_query_counter *counter, *unique_counter;
+
+         counter = &query->counters[c];
+         entry = _mesa_hash_table_search(counters_table, counter->symbol_name);
+
+         if (entry) {
+            unique_counter = entry->data;
+            unique_counter->query_mask |= BITFIELD64_BIT(q);
+            continue;
+         }
+
+         unique_counter = counter;
+         unique_counter->query_mask = BITFIELD64_BIT(q);
+
+         _mesa_hash_table_insert(counters_table, unique_counter->symbol_name, unique_counter);
+      }
+   }
+
+   perf->n_counters = _mesa_hash_table_num_entries(counters_table);
+   perf->counters = ralloc_array(perf, struct gen_perf_query_counter *,
+                                 perf->n_counters);
+
+   int c = 0;
+   hash_table_foreach(counters_table, entry) {
+      struct gen_perf_query_counter *counter = entry->data;
+      perf->counters[c++] = counter;
+   }
+
+   _mesa_hash_table_destroy(counters_table, NULL);
+
+   qsort(perf->counters, perf->n_counters, sizeof(perf->counters[0]),
+         compare_counters);
+}
+
 static bool
 load_oa_metrics(struct gen_perf_config *perf, int fd,
-                         const struct gen_device_info *devinfo)
+                const struct gen_device_info *devinfo)
 {
    perf_register_oa_queries_t oa_register = get_register_queries_function(devinfo);
    bool i915_perf_oa_available = false;
@@ -627,6 +682,8 @@ load_oa_metrics(struct gen_perf_config *perf, int fd,
    else
       enumerate_sysfs_metrics(perf, devinfo);
 
+   build_unique_counter_list(perf);
+
    return true;
 }
 
diff --git a/src/intel/perf/gen_perf.h b/src/intel/perf/gen_perf.h
index 3f933a664fa..83c6c3b9e3a 100644
--- a/src/intel/perf/gen_perf.h
+++ b/src/intel/perf/gen_perf.h
@@ -130,10 +130,12 @@ struct gen_perf_query_result {
 struct gen_perf_query_counter {
    const char *name;
    const char *desc;
+   const char *symbol_name;
    enum gen_perf_counter_type type;
    enum gen_perf_counter_data_type data_type;
    uint64_t raw_max;
    size_t offset;
+   uint64_t query_mask;
 
    union {
       uint64_t (*oa_counter_read_uint64)(struct gen_perf_config *perf,
@@ -203,6 +205,9 @@ struct gen_perf_config {
    struct gen_perf_query_info *queries;
    int n_queries;
 
+   struct gen_perf_query_counter **counters;
+   int n_counters;
+
    /* Variables referenced in the XML meta data for OA performance
     * counters, e.g in the normalization equations.
     *
diff --git a/src/intel/perf/gen_perf.py b/src/intel/perf/gen_perf.py
index a82259c7edb..e1ee1528ef1 100644
--- a/src/intel/perf/gen_perf.py
+++ b/src/intel/perf/gen_perf.py
@@ -378,6 +378,7 @@ def output_counter_report(set, counter, current_offset):
     c("counter->oa_counter_read_" + data_type + " = " + set.read_funcs[counter.get('symbol_name')] + ";\n")
     c("counter->name = \"" + counter.get('name') + "\";\n")
     c("counter->desc = \"" + counter.get('description') + "\";\n")
+    c("counter->symbol_name = \"" + counter.get('symbol_name') + "\";\n")
     c("counter->type = GEN_PERF_COUNTER_TYPE_" + semantic_type_uc + ";\n")
     c("counter->data_type = GEN_PERF_COUNTER_DATA_TYPE_" + data_type_uc + ";\n")
     c("counter->raw_max = " + set.max_values[counter.get('symbol_name')] + ";\n")
diff --git a/src/intel/perf/gen_perf_private.h b/src/intel/perf/gen_perf_private.h
index ac222d53727..2e4568fa9aa 100644
--- a/src/intel/perf/gen_perf_private.h
+++ b/src/intel/perf/gen_perf_private.h
@@ -41,7 +41,7 @@ gen_perf_query_add_stat_reg(struct gen_perf_query_info *query, uint32_t reg,
    assert(query->n_counters < query->max_counters);
 
    counter = &query->counters[query->n_counters];
-   counter->name = name;
+   counter->name = counter->symbol_name = name;
    counter->desc = description;
    counter->type = GEN_PERF_COUNTER_TYPE_RAW;
    counter->data_type = GEN_PERF_COUNTER_DATA_TYPE_UINT64;



More information about the mesa-commit mailing list