[Mesa-dev] [PATCH v2 shader-db] report.py: rework and update for cycle info

Connor Abbott cwabbott0 at gmail.com
Fri Oct 30 10:49:30 PDT 2015


Ping. I just pushed the corresponding mesa patch to master yesterday,
so I'd like to get this landed in shader-db soon.

On Fri, Oct 16, 2015 at 11:09 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
> Now that we have three separate things we want to measure (instructions,
> cycles, and loops), it's impractical to keep adding special code for
> changes in each thing. Instead, for each program in before and after we
> store a table of measurement -> value, and when reporting we loop over
> each measurement and report helped/hurt before reporting the gained/lost
> programs.
>
> v2:
> - Swap loop count and cycle count to be compatible with older shader-db.
> - Fix indentation.
> - Report summary information (hurt/helped) last to make it easier to find.
> - Squash in second commit to avoid duplicating the list of measurements
> due to the above.
>
> Signed-off-by: Connor Abbott <cwabbott0 at gmail.com>
> ---
>  report.py | 164 ++++++++++++++++++++++++++++++++++----------------------------
>  1 file changed, 89 insertions(+), 75 deletions(-)
>
> diff --git a/report.py b/report.py
> index 4c06714..409474a 100755
> --- a/report.py
> +++ b/report.py
> @@ -10,17 +10,22 @@ def get_results(filename):
>
>      results = {}
>
> -    re_match = re.compile(r"(\S+) - (.S \S+) shader: (\S*) inst, (\S*) loops")
> +    re_match = re.compile(r"(\S+) - (.S \S+) shader: (\S*) inst, (\S*) loops, (\S*) cycles")
>      for line in lines:
>          match = re.search(re_match, line)
>          if match is None:
>              continue
>
>          groups = match.groups()
> -        count = int(groups[2])
> -        loop = int(groups[3])
> -        if count != 0:
> -            results[(groups[0], groups[1])] = count, loop
> +        inst_count = int(groups[2])
> +        loop_count = int(groups[3])
> +        cycle_count = int(groups[4])
> +        if inst_count != 0:
> +            results[(groups[0], groups[1])] = {
> +                "instructions": inst_count,
> +                "cycles": cycle_count,
> +                "loops": loop_count
> +            }
>
>      return results
>
> @@ -43,83 +48,92 @@ def get_result_string(p, b, a):
>          p = p + ' '
>      return p + change(b, a)
>
> +def split_list(string):
> +    return string.split(",")
>
>  def main():
>      parser = argparse.ArgumentParser()
> +    parser.add_argument("--measurements", "-m", type=split_list,
> +                        default=["instructions", "cycles", "loops"],
> +                        help="comma-separated list of measurements to report")
>      parser.add_argument("before", type=get_results, help="the output of the original code")
>      parser.add_argument("after", type=get_results, help="the output of the new code")
>      args = parser.parse_args()
>
> -    total_before = 0
> -    total_after = 0
> -    total_before_loop = 0
> -    total_after_loop = 0
> -    affected_before = 0
> -    affected_after = 0
> +    total_before = {}
> +    total_after = {}
> +    affected_before = {}
> +    affected_after = {}
> +    num_hurt = {}
> +    num_helped = {}
>
> -    helped = []
> -    hurt = []
> -    lost = []
> -    gained = []
> -    loop_change = []
> -    for p in args.before:
> -        (name, type) = p
> -        namestr = name + " " + type
> -        before_count = args.before[p][0]
> -        before_loop = args.before[p][1]
> +    for m in args.measurements:
> +        total_before[m] = 0
> +        total_after[m] = 0
> +        affected_before[m] = 0
> +        affected_after[m] = 0
> +
> +        print m
> +
> +        helped = []
> +        hurt = []
> +        for p in args.before:
> +            before_count = args.before[p][m]
> +
> +            if args.after.get(p) is None:
> +                continue
>
> -        if args.after.get(p) is not None:
> -            after_count = args.after[p][0]
> -            after_loop = args.after[p][1]
> +            # If the number of loops changed, then we may have unrolled some
> +            # loops, in which case other measurements will be misleading.
> +            if m != "loops" and args.before[p]["loops"] != args.after[p]["loops"]:
> +                continue
>
> -            total_before_loop += before_loop
> -            total_after_loop += after_loop
> +            after_count = args.after[p][m]
>
> -            if before_loop == after_loop:
> -                total_before += before_count
> -                total_after += after_count
> +            total_before[m] += before_count
> +            total_after[m] += after_count
>
>              if before_count != after_count:
> -                affected_before += before_count
> -                affected_after += after_count
> +                affected_before[m] += before_count
> +                affected_after[m] += after_count
>
> -                if after_loop != before_loop:
> -                    loop_change.append(p);
> -                elif after_count > before_count:
> +                if after_count > before_count:
>                      hurt.append(p)
>                  else:
>                      helped.append(p)
> -        else:
> -            lost.append(namestr)
>
> -    for p in args.after:
> -        if args.before.get(p) is None:
> -            gained.append(p[0] + " " + p[1])
> +        helped.sort(
> +            key=lambda k: float(args.before[k][m] - args.after[k][m]) / args.before[k][m])
> +        for p in helped:
> +            namestr = p[0] + " " + p[1]
> +            print(m + " helped:   " + get_result_string(
> +                namestr, args.before[p][m], args.after[p][m]))
> +        if len(helped) > 0:
> +            print("")
>
> -    helped.sort(
> -        key=lambda k: float(args.before[k][0] - args.after[k][0]) / args.before[k][0])
> -    for p in helped:
> -        namestr = p[0] + " " + p[1]
> -        print("helped:   " + get_result_string(
> -            namestr, args.before[p][0], args.after[p][0]))
> -    if len(helped) > 0:
> -        print("")
> +        hurt.sort(
> +            key=lambda k: float(args.after[k][m] - args.before[k][m]) / args.before[k][m])
> +        for p in hurt:
> +            namestr = p[0] + " " + p[1]
> +            print(m + " HURT:   " + get_result_string(
> +                namestr, args.before[p][m], args.after[p][m]))
> +        if len(hurt) > 0:
> +            print("")
>
> -    hurt.sort(
> -        key=lambda k: float(args.after[k][0] - args.before[k][0]) / args.before[k][0])
> -    for p in hurt:
> -        namestr = p[0] + " " + p[1]
> -        print("HURT:   " + get_result_string(
> -            namestr, args.before[p][0], args.after[p][0]))
> -    if len(hurt) > 0:
> -        print("")
> +        num_helped[m] = len(helped)
> +        num_hurt[m] = len(hurt)
>
> -    for p in loop_change:
> -        namestr = p[0] + " " + p[1]
> -        print("LOOP CHANGE (" + str(args.before[p][1]) + " -> " + str(args.after[p][1]) +
> -        "): " + get_result_string(namestr, args.before[p][0], args.after[p][0]))
> -    if len(loop_change) > 0:
> -        print("")
> +
> +    lost = []
> +    gained = []
> +
> +    for p in args.before:
> +        if args.after.get(p) is None:
> +            lost.append(p[0] + " " + p[1])
> +
> +    for p in args.after:
> +        if args.before.get(p) is None:
> +            gained.append(p[0] + " " + p[1])
>
>      lost.sort()
>      for p in lost:
> @@ -133,20 +147,20 @@ def main():
>      if len(gained) > 0:
>          print("")
>
> -    print("total instructions in shared programs: {}\n"
> -          "instructions in affected programs:     {}\n"
> -          "total loops in shared programs:        {}\n"
> -          "helped:                                {}\n"
> -          "HURT:                                  {}\n"
> -          "GAINED:                                {}\n"
> -          "LOST:                                  {}".format(
> -              change(total_before, total_after),
> -              change(affected_before, affected_after),
> -              change(total_before_loop, total_after_loop),
> -              len(helped),
> -              len(hurt),
> -              len(gained),
> -              len(lost)))
> +    for m in args.measurements:
> +        print("total {0} in shared programs: {1}\n"
> +              "{0} in affected programs: {2}\n"
> +              "helped: {3}\n"
> +              "HURT: {4}\n".format(
> +               m,
> +               change(total_before[m], total_after[m]),
> +               change(affected_before[m], affected_after[m]),
> +               num_helped[m],
> +               num_hurt[m]))
> +
> +
> +    print("LOST:   " + str(len(lost)))
> +    print("GAINED: " + str(len(gained)))
>
>
>  if __name__ == "__main__":
> --
> 2.4.3
>


More information about the mesa-dev mailing list