diff --git a/scripts/likwid_perfgroup_to_cc_config.py b/scripts/likwid_perfgroup_to_cc_config.py new file mode 100755 index 0000000..52959ed --- /dev/null +++ b/scripts/likwid_perfgroup_to_cc_config.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +import os, os.path, sys, getopt, re, json + +def which(cmd): + ospath = os.environ.get("PATH", "") + for p in ospath.split(":"): + testcmd = os.path.join(p, cmd) + if os.access(testcmd, os.X_OK): + return testcmd + return None + +def group_to_json(groupfile): + gdata = [] + with open(groupfile, "r") as fp: + gdata = fp.read().strip().split("\n") + events = {} + metrics = [] + parse_events = False + parse_metrics = False + for line in gdata: + if line == "EVENTSET": + parse_events = True + parse_metrics = False + continue + if line == "METRICS": + parse_events = False + parse_metrics = True + continue + if len(line) == 0 or line.startswith("SHORT") or line == "LONG": + parse_events = False + parse_metrics = False + continue + if parse_events: + m = re.match("([\w\d]+)\s+([\w\d_]+)", line) + if m: + events[m.group(1)] = m.group(2) + if parse_metrics: + llist = re.split("\s+", line) + calc = llist[-1] + metric = " ".join(llist[:-1]) + scope = "hwthread" + if "BOX" in calc: + scope = "socket" + if "PWR" in calc: + scope = "socket" + + m = {"name" : metric, "calc": calc, "scope" : scope, "publish" : True} + metrics.append(m) + return {"events" : events, "metrics" : metrics} + +if len(sys.argv) != 3: + print("Usage: $0 ") + sys.exit(1) + + +arch = sys.argv[1] +group = sys.argv[2] + +ltopo = which("likwid-topology") +if not ltopo: + print("Cannot find LIKWID installation. Please add LIKWID bin folder to your PATH.") + sys.exit(1) + +bindir = os.path.dirname(ltopo) + +groupdir = os.path.normpath(os.path.join(bindir, "../share/likwid/perfgroups")) +if not os.path.exists(groupdir): + print("Cannot find LIKWID performance groups in default install location") + sys.exit(1) + +archdir = os.path.join(groupdir, arch) +if not os.path.exists(archdir): + print("Cannot find LIKWID performance groups for architecture {}".format(arch)) + sys.exit(1) + +groupfile = os.path.join(archdir, "{}.txt".format(group)) +if not os.path.exists(groupfile): + print("Cannot find LIKWID performance group {} for architecture {}".format(group, arch)) + sys.exit(1) + +gdata = group_to_json(groupfile) +print(json.dumps(gdata, sort_keys=True, indent=2))