[Mesa-dev] [PATCH shader-db] si-report: Track max waves per CU

Marek Olšák maraeo at gmail.com
Tue Jan 5 04:28:06 PST 2016


Hi,

I'd like us to do this computation in Mesa, because it can be more
accurate there. The pixel shader wave count depends heavily on LDS,
because each interpolated input occupies 12 dwords of LDS per
primitive and there can be 1-16 primitives per wave. With 32 inputs
and 16 primitives, you can get 6144 dwords of LDS per wave and this is
without the extra LDS storage needed by derivatives. In a nutshell,
you need to know the number of interpolated inputs, then you can
compute the best case (1 primitive) scenario and the worst case (16
primitives).

Marek

On Tue, Jan 5, 2016 at 1:21 AM, Tom Stellard <thomas.stellard at amd.com> wrote:
> ---
>  si-report.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 54 insertions(+), 2 deletions(-)
>
> diff --git a/si-report.py b/si-report.py
> index ec88112..e717af0 100755
> --- a/si-report.py
> +++ b/si-report.py
> @@ -65,6 +65,12 @@ def get_scratch_str(value, suffixes = True):
>          suffix = 'bytes per wave'
>      return get_value_str(value, 'Scratch', suffix)
>
> +def get_waves_per_cu_str(value, suffixes = True):
> +    suffix = ''
> +    if suffixes:
> +        suffix = 'waves'
> +    return get_value_str(value, 'Max Waves / CU', suffix)
> +
>  def calculate_percent_change(b, a):
>      if b == 0:
>          return 0
> @@ -89,15 +95,17 @@ class si_stats:
>          self.code_size = 0
>          self.lds = 0
>          self.scratch = 0
> +        self.max_waves_per_cu = 0
>
>
>      def to_string(self, suffixes = True):
> -        return "{}{}{}{}{}".format(
> +        return "{}{}{}{}{}{}".format(
>                  get_sgpr_str(self.sgprs, suffixes),
>                  get_vgpr_str(self.vgprs, suffixes),
>                  get_code_size_str(self.code_size, suffixes),
>                  get_lds_str(self.lds, suffixes),
> -                get_scratch_str(self.scratch, suffixes))
> +                get_scratch_str(self.scratch, suffixes),
> +                get_waves_per_cu_str(self.max_waves_per_cu, suffixes))
>
>
>      def __str__(self):
> @@ -109,6 +117,7 @@ class si_stats:
>          self.code_size += other.code_size
>          self.lds += other.lds
>          self.scratch += other.scratch
> +        self.max_waves_per_cu += other.max_waves_per_cu
>
>      def update(self, comp, cmp_fn):
>          for name in self.__dict__.keys():
> @@ -153,6 +162,48 @@ class si_stats:
>                  return False
>          return True
>
> +#TODO: Handle VI+ and take LDS into account.
> +def compute_max_waves_per_cu(sgprs, vgprs):
> +    sgpr_waves = 10
> +    if sgprs <= 48:
> +        sgpr_waves = 10
> +    elif sgprs <= 56:
> +        sgpr_waves = 9
> +    elif sgprs <= 64:
> +        sgpr_waves = 8
> +    elif sgprs <= 72:
> +        sgpr_waves = 7
> +    elif sgprs <= 80:
> +        sgpr_waves = 6
> +    elif sgprs <= 96:
> +        sgpr_waves = 5
> +    else:
> +        sgpr_waves = 4
> +
> +    vgpr_waves = 10
> +    if vgprs <= 24:
> +        vgpr_waves = 10
> +    elif vgprs <= 28:
> +        vgpr_waves = 9
> +    elif vgprs <= 32:
> +        vgpr_waves = 8
> +    elif vgprs <= 36:
> +        vgpr_waves = 7
> +    elif vgprs <= 40:
> +        vgpr_waves = 6
> +    elif vgprs <= 48:
> +        vgpr_waves = 5
> +    elif vgprs <= 64:
> +        vgpr_waves = 4
> +    elif vgprs <= 84:
> +        vgpr_waves = 3
> +    elif vgprs <= 128:
> +        vgpr_waves = 2
> +    else:
> +        vgpr_waves = 1
> +
> +    return min(sgpr_waves, vgpr_waves)
> +
>  def get_results(filename):
>      file = open(filename, "r")
>      lines = file.read().split('\n')
> @@ -199,6 +250,7 @@ def get_results(filename):
>              current_stats.scratch = int(match.groups()[0])
>              continue
>
> +        current_stats.max_waves_per_cu = compute_max_waves_per_cu(current_stats.sgprs, current_stats.vgprs)
>          match = re.search(re_end, line)
>          if match:
>              results.append(current_stats)
> --
> 2.0.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list