[igt-dev] [PATCH i-g-t v6 29/36] i915/perf: update import script

Umesh Nerlige Ramappa umesh.nerlige.ramappa at intel.com
Mon Oct 10 23:00:08 UTC 2022


On Mon, Oct 10, 2022 at 09:42:08PM +0000, Umesh Nerlige Ramappa wrote:
>From: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>
>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa at intel.com>

>---
> lib/i915/perf-configs/mdapi-xml-convert.py | 180 ++++++++++++---------
> lib/i915/perf-configs/oa-bdw.xml           |   2 +-
> lib/i915/perf-configs/oa_guid_registry.py  |  15 +-
> lib/i915/perf-configs/update-guids.py      |  23 +--
> lib/i915/perf.h                            |   1 +
> 5 files changed, 131 insertions(+), 90 deletions(-)
>
>diff --git a/lib/i915/perf-configs/mdapi-xml-convert.py b/lib/i915/perf-configs/mdapi-xml-convert.py
>index 7b5be901..ba053ae3 100755
>--- a/lib/i915/perf-configs/mdapi-xml-convert.py
>+++ b/lib/i915/perf-configs/mdapi-xml-convert.py
>@@ -45,6 +45,8 @@ import sys
> import time
> import uuid
>
>+import codegen
>+
> import xml.etree.ElementTree as et
> import xml.sax.saxutils as saxutils
>
>@@ -54,6 +56,55 @@ import oa_guid_registry as oa_registry
> # MDAPI configs include writes to some non-config registers,
> # thus the blacklists...
>
>+hsw_chipset_params = {
>+    'a_offset': 12,
>+    'b_offset': 192,
>+    'c_offset': 224,
>+    'oa_report_size': 256,
>+    'registers': {
>+        # TODO extend the symbol table for nicer output...
>+        0x2710: { 'name': 'OASTARTTRIG1' },
>+        0x2714: { 'name': 'OASTARTTRIG1' },
>+        0x2718: { 'name': 'OASTARTTRIG1' },
>+        0x271c: { 'name': 'OASTARTTRIG1' },
>+        0x2720: { 'name': 'OASTARTTRIG1' },
>+        0x2724: { 'name': 'OASTARTTRIG6' },
>+        0x2728: { 'name': 'OASTARTTRIG7' },
>+        0x272c: { 'name': 'OASTARTTRIG8' },
>+        0x2740: { 'name': 'OAREPORTTRIG1' },
>+        0x2744: { 'name': 'OAREPORTTRIG2' },
>+        0x2748: { 'name': 'OAREPORTTRIG3' },
>+        0x274c: { 'name': 'OAREPORTTRIG4' },
>+        0x2750: { 'name': 'OAREPORTTRIG5' },
>+        0x2754: { 'name': 'OAREPORTTRIG6' },
>+        0x2758: { 'name': 'OAREPORTTRIG7' },
>+        0x275c: { 'name': 'OAREPORTTRIG8' },
>+        0x2770: { 'name': 'OACEC0_0' },
>+        0x2774: { 'name': 'OACEC0_1' },
>+        0x2778: { 'name': 'OACEC1_0' },
>+        0x277c: { 'name': 'OACEC1_1' },
>+        0x2780: { 'name': 'OACEC2_0' },
>+        0x2784: { 'name': 'OACEC2_1' },
>+        0x2788: { 'name': 'OACEC3_0' },
>+        0x278c: { 'name': 'OACEC3_1' },
>+        0x2790: { 'name': 'OACEC4_0' },
>+        0x2794: { 'name': 'OACEC4_1' },
>+        0x2798: { 'name': 'OACEC5_0' },
>+        0x279c: { 'name': 'OACEC5_1' },
>+        0x27a0: { 'name': 'OACEC6_0' },
>+        0x27a4: { 'name': 'OACEC6_1' },
>+        0x27a8: { 'name': 'OACEC7_0' },
>+        0x27ac: { 'name': 'OACEC7_1' },
>+    },
>+    'config_reg_blacklist': {
>+        0x2364, # OASTATUS1 register
>+    },
>+    'register_offsets': {
>+        0x1f0: 'PERFCNT 0',
>+        0x1f8: 'PERFCNT 1',
>+    },
>+}
>+
> gen8_11_chipset_params = {
>     'a_offset': 16,
>     'b_offset': 192,
>@@ -83,50 +134,7 @@ xehpsdv_chipset_params = {
> }
>
> chipsets = {
>-    'HSW': {
>-        'a_offset': 12,
>-        'b_offset': 192,
>-        'c_offset': 224,
>-        'oa_report_size': 256,
>-        'registers': {
>-            # TODO extend the symbol table for nicer output...
>-                0x2710: { 'name': 'OASTARTTRIG1' },
>-            0x2714: { 'name': 'OASTARTTRIG1' },
>-            0x2718: { 'name': 'OASTARTTRIG1' },
>-            0x271c: { 'name': 'OASTARTTRIG1' },
>-            0x2720: { 'name': 'OASTARTTRIG1' },
>-            0x2724: { 'name': 'OASTARTTRIG6' },
>-            0x2728: { 'name': 'OASTARTTRIG7' },
>-            0x272c: { 'name': 'OASTARTTRIG8' },
>-            0x2740: { 'name': 'OAREPORTTRIG1' },
>-            0x2744: { 'name': 'OAREPORTTRIG2' },
>-            0x2748: { 'name': 'OAREPORTTRIG3' },
>-            0x274c: { 'name': 'OAREPORTTRIG4' },
>-            0x2750: { 'name': 'OAREPORTTRIG5' },
>-            0x2754: { 'name': 'OAREPORTTRIG6' },
>-            0x2758: { 'name': 'OAREPORTTRIG7' },
>-            0x275c: { 'name': 'OAREPORTTRIG8' },
>-            0x2770: { 'name': 'OACEC0_0' },
>-            0x2774: { 'name': 'OACEC0_1' },
>-            0x2778: { 'name': 'OACEC1_0' },
>-            0x277c: { 'name': 'OACEC1_1' },
>-            0x2780: { 'name': 'OACEC2_0' },
>-            0x2784: { 'name': 'OACEC2_1' },
>-            0x2788: { 'name': 'OACEC3_0' },
>-            0x278c: { 'name': 'OACEC3_1' },
>-            0x2790: { 'name': 'OACEC4_0' },
>-            0x2794: { 'name': 'OACEC4_1' },
>-            0x2798: { 'name': 'OACEC5_0' },
>-            0x279c: { 'name': 'OACEC5_1' },
>-            0x27a0: { 'name': 'OACEC6_0' },
>-            0x27a4: { 'name': 'OACEC6_1' },
>-            0x27a8: { 'name': 'OACEC7_0' },
>-            0x27ac: { 'name': 'OACEC7_1' },
>-        },
>-        'config_reg_blacklist': {
>-            0x2364, # OASTATUS1 register
>-        },
>-    },
>+    'HSW': hsw_chipset_params,
>     'BDW': gen8_11_chipset_params,
>     'CHV': gen8_11_chipset_params,
>     'SKL': gen8_11_chipset_params,
>@@ -141,8 +149,11 @@ chipsets = {
>     'RKL': gen8_11_chipset_params,
>     'DG1': gen8_11_chipset_params,
>     'ADL': gen8_11_chipset_params,
>+    'ACM': xehpsdv_chipset_params,
> }
>
>+xehp_plus = ( 'ACM', )
>+
> register_types = { 'OA', 'NOA', 'FLEX', 'PM' }
>
> default_set_blacklist = { "RenderDX1x", # TODO: rename to something non 'DX'
>@@ -158,23 +169,11 @@ counter_blacklist = {
>                          # investiguate how to get this value.
> }
>
>-sys_vars = { "EuCoresTotalCount",
>-             "EuSlicesTotalCount",
>-             "SamplersTotalCount",
>-             "EuThreadsCount",
>-             "GpuMinFrequencyMHz",
>-             "GpuMaxFrequencyMHz",
>-             "GpuTimestampFrequency",
>-             "SliceMask",
>-             "SubsliceMask",
>-             "EuSubslicesTotalCount",
>-             "EuDualSubslicesTotalCount",
>-           }
>-
> def underscore(name):
>     s = re.sub('MHz', 'Mhz', name)
>     s = re.sub('\.', '_', s)
>     s = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s)
>+    s = re.sub('#', '_', s)
>     return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s).lower()
>
> def print_err(*args):
>@@ -215,7 +214,7 @@ def read_token_to_rpn_read(chipset, token, raw_offsets):
>                 assert 0
>         elif offset < b_offset:
>             a_cnt_offset = int((offset - a_offset) / 4)
>-            if chipset == "XEHPSDV":
>+            if chipset in xehp_plus:
>                 # Most A counters are in a contiguous array, except
>                 # this A37.
>                 if a_cnt_offset == 42:
>@@ -246,7 +245,7 @@ def read_token_to_rpn_read(chipset, token, raw_offsets):
>                 return "C " + str(idx - 54) + " READ"
>             else:
>                 return "{0} READ".format(read_value(chipset, offset))
>-        elif chipset == "XEHPSDV":
>+        elif chipset in xehp_plus:
>             # For XEHPSDV the array of accumulated counters is
>             # assumed to start with a GPU_TIME then GPU_CLOCK,
>             # then 38 A counters, then 8 B counters and finally
>@@ -354,10 +353,38 @@ def strip_dx_apis(text):
>
>     return stripped.strip()
>
>+def add_gpu_core_clocks_if_missing(metric_set, counters, counter_deps):
>+    if len(counters) < 1:
>+        return
>+
>+    for name,element in counters.items():
>+        if name == 'GpuCoreClocks':
>+            return
>+
>+    print_err("WARNING: add missing GpuCoreClocks counter for MetricSets=\"{0}\"".format(metric_set.get('ShortName')))
>+    counter = et.SubElement(metric_set, 'Metric')
>+    counter.set("SymbolName", "GpuCoreClocks")
>+    counter.set("SignalName", "oa.fixed")
>+    counter.set("ShortName", "GPU Core Clocks")
>+    counter.set("LongName", "The total number of GPU core clocks elapsed during the measurement.")
>+    counter.set("Group", "GPU")
>+    counter.set("UsageFlags", "Tier1 Frame Batch Draw")
>+    counter.set("MetricType", "EVENT")
>+    counter.set("ResultType", "UINT64")
>+    counter.set("MetricUnits", "cycles")
>+    counter.set("HWUnitType", "GPU")
>+    counter.set("SnapshotReportReadEquation", "dw at 0x0c")
>+    counter.set("SnapshotReportDeltaFunction", "DELTA 32")
>+    counter.set("DeltaReportReadEquation", "qw at 0x08")
>+    counter.set("NormalizationEquation", "")
>+
>+    counters["GpuCoreClocks"] = counter
>+    counter_deps["GpuCoreClocks"] = []
>+
> # For recursively appending counters in order of dependencies...
> def append_deps_and_counter(mdapi_counter, mdapi_counters, deps,
>                             sorted_array, sorted_set):
>-    symbol_name = mdapi_counter.get('SymbolName')
>+    symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName'))
>
>     if symbol_name in sorted_set:
>         return
>@@ -562,6 +589,7 @@ guids = {}
> guids_xml = et.parse(args.guids)
> for guid in guids_xml.findall(".//guid"):
>     hashing_key = oa_registry.Registry.chipset_derive_hash(guid.get('chipset'),
>+                                                           guid.get('name'),
>                                                            guid.get('mdapi_config_hash'))
>     guids[hashing_key] = guid.get('id')
>
>@@ -569,6 +597,14 @@ for arg in args.xml:
>     mdapi = et.parse(arg)
>
>     concurrent_group = mdapi.find(".//ConcurrentGroup")
>+    chipset = oa_registry.Registry.chipset_name(concurrent_group.get('SupportedHW'))
>+
>+    chipset_fullname = chipset
>+    if concurrent_group.get('SupportedGT') != None:
>+        chipset_fullname = chipset_fullname + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT'))
>+    if chipset not in chipsets:
>+        print_err("WARNING: unsupported chipset {0}, consider updating {1}".format(chipset, __file__))
>+        continue
>
>     for mdapi_set in mdapi.findall(".//MetricSet"):
>
>@@ -576,20 +612,12 @@ for arg in args.xml:
>         if "OGL" not in apis and "OCL" not in apis and "MEDIA" not in apis:
>             continue
>
>-        set_symbol_name = mdapi_set.get('SymbolName')
>+        set_symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_set.get('SymbolName'))
>
>         if set_symbol_name in sets:
>             print_err("WARNING: duplicate set named \"" + set_symbol_name + "\" (SKIPPING)")
>             continue
>
>-        chipset = oa_registry.Registry.chipset_name(mdapi_set.get('SupportedHW'))
>-        chipset_fullname = chipset
>-        if concurrent_group.get('SupportedGT') != None:
>-            chipset_fullname = chipset_fullname + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT'))
>-        if chipset not in chipsets:
>-            print_err("WARNING: unsupported chipset {0}, consider updating {1}".format(chipset, __file__))
>-            continue
>-
>         if args.whitelist:
>             set_whitelist = args.whitelist.split()
>             if set_symbol_name not in set_whitelist:
>@@ -666,6 +694,7 @@ for arg in args.xml:
>
>         mdapi_hw_config_hash = oa_registry.Registry.mdapi_hw_config_hash(mdapi_set)
>         guid_hash = oa_registry.Registry.chipset_derive_hash(chipset_fullname.lower(),
>+                                                             set_symbol_name,
>                                                              mdapi_hw_config_hash)
>         hw_config_hash = oa_registry.Registry.hw_config_hash(set)
>
>@@ -693,7 +722,7 @@ for arg in args.xml:
>         mdapi_counter_deps = {}
>
>         for mdapi_counter in mdapi_set.findall("Metrics/Metric"):
>-            symbol_name = mdapi_counter.get('SymbolName')
>+            symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName'))
>
>             if symbol_name in counter_blacklist:
>                 continue;
>@@ -712,12 +741,13 @@ for arg in args.xml:
>             equations = expand_macros(equations)
>             equations = equations.replace('$$', "$")
>             for token in equations.split():
>-                if token[0] == '$' and token[1:] not in sys_vars and token[1:] != "Self":
>+                if token[0] == '$' and not codegen.is_hw_var(token) and token[1:] != "Self":
>                     deps.append(token[1:])
>
>             mdapi_counters[symbol_name] = mdapi_counter
>             mdapi_counter_deps[symbol_name] = deps
>
>+        add_gpu_core_clocks_if_missing(mdapi_set, mdapi_counters, mdapi_counter_deps)
>         sorted_mdapi_counters = sort_counters(mdapi_counters, mdapi_counter_deps)
>
>         for mdapi_counter in sorted_mdapi_counters:
>@@ -746,11 +776,11 @@ for arg in args.xml:
>                 #mdapi_counter.set('DeltaReportReadEquation', '$GpuCoreClocks $GpuTime UDIV')
>
>
>-            symbol_name = mdapi_counter.get('SymbolName')
>+            symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName'))
>
>             counter = et.SubElement(set, 'counter')
>             counter.set('name', apply_aliases(mdapi_counter.get('ShortName'), aliases))
>-            counter.set('symbol_name', mdapi_counter.get('SymbolName'))
>+            counter.set('symbol_name', oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName')))
>             counter.set('underscore_name', underscore(mdapi_counter.get('SymbolName')))
>             counter.set('description', apply_aliases(mdapi_counter.get('LongName'), aliases))
>             counter.set('mdapi_group', apply_aliases(to_text(mdapi_counter.get('Group')), aliases))
>@@ -943,7 +973,7 @@ for arg in args.xml:
>                         #   print_err("WARNING: Counter equation (\"" + equation + "\") references un-kept raw equation of another counter : MetricSet=\"" + \
>                         #             mdapi_set.get('ShortName') + "\" Metric=\"" + mdapi_counter.get('ShortName') + "\"")
>
>-                    elif token[1:] not in raw_equations and token[1:] not in sys_vars:
>+                    elif token[1:] not in raw_equations and not codegen.is_hw_var(token):
>                         print_err("Unknown variable name: \"" + token + "\" in equation \"" + equation + "\"")
>
>             symbol_name = counter.get('symbol_name')
>@@ -952,7 +982,7 @@ for arg in args.xml:
>             equation = equation.replace('$$', "$")
>             for token in equation.split():
>                 if token[0] == '$':
>-                    if token[1:] not in counters and token[1:] not in sys_vars:
>+                    if token[1:] not in counters and not codegen.is_hw_var(token):
>                         print_err("WARNING: Counter equation (\"" + equation + "\") with unknown variable " + \
>                                   token + " (maybe skipped counter): MetricSet=\"" + mdapi_set.get('ShortName') + \
>                                   "\" Metric=\"" + mdapi_counter.get('SymbolName') + "(" + mdapi_counter.get('ShortName') + \
>diff --git a/lib/i915/perf-configs/oa-bdw.xml b/lib/i915/perf-configs/oa-bdw.xml
>index 247fec4f..4fd5dccb 100644
>--- a/lib/i915/perf-configs/oa-bdw.xml
>+++ b/lib/i915/perf-configs/oa-bdw.xml
>@@ -1,5 +1,5 @@
> <?xml version="1.0"?>
>-<metrics version="1619078710" merge_md5="">
>+<metrics version="1650881753" merge_md5="">
>   <set name="Render Metrics Basic set"
>        chipset="BDW"
>        symbol_name="RenderBasic"
>diff --git a/lib/i915/perf-configs/oa_guid_registry.py b/lib/i915/perf-configs/oa_guid_registry.py
>index 1e082ddf..50076e95 100644
>--- a/lib/i915/perf-configs/oa_guid_registry.py
>+++ b/lib/i915/perf-configs/oa_guid_registry.py
>@@ -72,16 +72,15 @@ class Registry:
>
>         return hashlib.md5(registers_str).hexdigest()
>
>-
>     @staticmethod
>-    def chipset_derive_hash(chipset, hash):
>-        """Derive a HW config hash for a given chipset.
>+    def chipset_derive_hash(chipset, set_name, hash):
>+        """Derive a HW config hash for a given chipset & set name.
>
>         This helps us avoiding collisions with identical config across
>         different Gen or GT.
>         """
>
>-        return "%s-%s" % (chipset, hash)
>+        return "%s-%s-%s" % (chipset, set_name, hash)
>
>
>     @staticmethod
>@@ -99,7 +98,9 @@ class Registry:
>                            'EHL',
>                            'TGL',
>                            'RKL',
>-                           'DG1' )
>+                           'DG1',
>+                           'ACM',
>+                           'PVC' )
>         if name in known_chipsets:
>             return name
>
>@@ -110,3 +111,7 @@ class Registry:
>     @staticmethod
>     def gt_name(name):
>         return re.sub(' ', '', name)
>+
>+    @staticmethod
>+    def sanitize_symbol_name(text):
>+        return text.replace('#', "_")
>diff --git a/lib/i915/perf-configs/update-guids.py b/lib/i915/perf-configs/update-guids.py
>index d38a7a95..de66b2f3 100755
>--- a/lib/i915/perf-configs/update-guids.py
>+++ b/lib/i915/perf-configs/update-guids.py
>@@ -60,8 +60,10 @@ def print_err(*args):
>     sys.stderr.write(' '.join(map(str,args)) + '\n')
>
> def guid_hashing_key(guid_obj):
>-    return oa_registry.Registry.chipset_derive_hash(guid_obj['chipset'],
>-                                                    guid_obj['mdapi_config_hash'])
>+    ret = oa_registry.Registry.chipset_derive_hash(guid_obj['chipset'],
>+                                                   guid_obj['name'],
>+                                                   guid_obj['mdapi_config_hash'])
>+    return ret
>
> parser = argparse.ArgumentParser()
> parser.add_argument("xml", nargs="+", help="XML description of metrics")
>@@ -101,6 +103,7 @@ for guid in guids_xml.findall(".//guid"):
>
>     if 'mdapi_config_hash' in guid_obj:
>         hashing_key = oa_registry.Registry.chipset_derive_hash(guid_obj['chipset'],
>+                                                               guid_obj['name'],
>                                                                guid_obj['mdapi_config_hash'])
>         mdapi_config_hash_guid_table[hashing_key] = guid_obj
>
>@@ -121,20 +124,20 @@ for arg in args.xml:
>     internal = et.parse(arg)
>
>     concurrent_group = internal.find(".//ConcurrentGroup")
>+    chipset = oa_registry.Registry.chipset_name(concurrent_group.get('SupportedHW')).lower()
>+    if concurrent_group.get('SupportedGT') != None:
>+        chipset = chipset + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT')).lower()
>+
>
>     for mdapi_set in internal.findall(".//MetricSet"):
>
>         mdapi_config_hash = oa_registry.Registry.mdapi_hw_config_hash(mdapi_set)
>
>-        chipset = oa_registry.Registry.chipset_name(mdapi_set.get('SupportedHW')).lower()
>-        if concurrent_group.get('SupportedGT') != None:
>-            chipset = chipset + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT')).lower()
>-
>-        set_name = mdapi_set.get('SymbolName')
>+        set_name = oa_registry.Registry.sanitize_symbol_name(mdapi_set.get('SymbolName'))
>
>         name = chipset + "_" + set_name;
>
>-        hashing_key = oa_registry.Registry.chipset_derive_hash(chipset, mdapi_config_hash)
>+        hashing_key = oa_registry.Registry.chipset_derive_hash(chipset, set_name, mdapi_config_hash)
>         if hashing_key in mdapi_config_hash_guid_table:
>             guid_obj = mdapi_config_hash_guid_table[hashing_key]
>
>@@ -174,7 +177,9 @@ chipsets = [ 'hsw',
>              'bxt', 'glk',
>              'cnl',
>              'icl', 'ehl',
>-             'tglgt1', 'tglgt2', 'rkl', 'dg1', 'adl' ]
>+             'tglgt1', 'tglgt2', 'rkl', 'dg1', 'adl',
>+             'acmgt1', 'acmgt2', 'acmgt3',
>+]
>
> for chipset in chipsets:
>     filename = 'oa-' + chipset + '.xml'
>diff --git a/lib/i915/perf.h b/lib/i915/perf.h
>index 1493da47..ef2a3029 100644
>--- a/lib/i915/perf.h
>+++ b/lib/i915/perf.h
>@@ -189,6 +189,7 @@ typedef enum {
> 	INTEL_PERF_LOGICAL_COUNTER_UNIT_EU_ATOMIC_REQUESTS_TO_L3_CACHE_LINES,
> 	INTEL_PERF_LOGICAL_COUNTER_UNIT_EU_REQUESTS_TO_L3_CACHE_LINES,
> 	INTEL_PERF_LOGICAL_COUNTER_UNIT_EU_BYTES_PER_L3_CACHE_LINE,
>+	INTEL_PERF_LOGICAL_COUNTER_UNIT_GBPS,
>
> 	INTEL_PERF_LOGICAL_COUNTER_UNIT_MAX
> } intel_perf_logical_counter_unit_t;
>-- 
>2.25.1
>


More information about the igt-dev mailing list