[Mesa-dev] [PATCH v3] i965/fs: Add remove_extra_rounding_modes optimization

Jason Ekstrand jason at jlekstrand.net
Mon Sep 11 16:53:10 UTC 2017


On Mon, Sep 11, 2017 at 8:00 AM, Jose Maria Casanova Crespo <
jmcasanova at igalia.com> wrote:

> From: Alejandro Piñeiro <apinheiro at igalia.com>
>
> Although from SPIR-V point of view, rounding modes are attached to the
> operation/destination, on i965 it is a status, so we don't need to
> explicitly set the rounding mode if the one we want is already set.
>
> Taking into account that the default mode is RTE, one possible
> optimization would be optimize out the first RTE set for each
> block. For in order to work, we would need to take into account block
> interrelationships. At this point, it is not worth to complicate the
> optimization for such small gain.
>
> v2: Use a single SHADER_OPCODE_RND_MODE opcode taking an immediate
>     with the rounding mode (Curro)
> v3: Reset optimization for every block. (Jason Ekstrand)
>
> Signed-off-by: Jose Maria Casanova Crespo <jmcasanova at igalia.com>
> Signed-off-by: Alejandro Piñeiro <apinheiro at igalia.com>
> ---
>  src/intel/compiler/brw_eu_defines.h |  3 ++-
>  src/intel/compiler/brw_fs.cpp       | 37 ++++++++++++++++++++++++++++++
> +++++++
>  src/intel/compiler/brw_fs.h         |  1 +
>  3 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/src/intel/compiler/brw_eu_defines.h
> b/src/intel/compiler/brw_eu_defines.h
> index 72f773352e..aea58284bc 100644
> --- a/src/intel/compiler/brw_eu_defines.h
> +++ b/src/intel/compiler/brw_eu_defines.h
> @@ -1227,7 +1227,8 @@ enum PACKED brw_rnd_mode {
>     BRW_RND_MODE_RTNE = 0,  /* Round to Nearest or Even */
>     BRW_RND_MODE_RU = 1,    /* Round Up, toward +inf */
>     BRW_RND_MODE_RD = 2,    /* Round Down, toward -inf */
> -   BRW_RND_MODE_RTZ = 3    /* Round Toward Zero */
> +   BRW_RND_MODE_RTZ = 3,    /* Round Toward Zero */
> +   BRW_RND_MODE_UNSPECIFIED  /* Unspecified rounding mode */
>

In the future, please end enum lists with commas.  The C grammar allows it
and it means you don't have an extra +- line if you add an entry to the end.

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>


>  };
>
>  #endif /* BRW_EU_DEFINES_H */
> diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
> index 45236e3cab..9b33a32917 100644
> --- a/src/intel/compiler/brw_fs.cpp
> +++ b/src/intel/compiler/brw_fs.cpp
> @@ -3071,6 +3071,42 @@ fs_visitor::remove_duplicate_mrf_writes()
>     return progress;
>  }
>
> +/**
> + * Rounding modes for conversion instructions are included for each
> + * conversion, but right now it is a state. So once it is set,
> + * we don't need to call it again for subsequent calls.
> + *
> + * This is useful for vector/matrices conversions, as setting the
> + * mode once is enough for the full vector/matrix
> + */
> +bool
> +fs_visitor::remove_extra_rounding_modes()
> +{
> +   bool progress = false;
> +
> +   foreach_block (block, cfg) {
> +      brw_rnd_mode prev_mode = BRW_RND_MODE_UNSPECIFIED;
> +
> +      foreach_inst_in_block_safe (fs_inst, inst, block) {
> +         if (inst->opcode == SHADER_OPCODE_RND_MODE) {
> +            assert(inst->src[0].file == BRW_IMMEDIATE_VALUE);
> +            const brw_rnd_mode mode = (brw_rnd_mode) inst->src[0].d;
> +            if (mode == prev_mode) {
> +               inst->remove(block);
> +               progress = true;
> +            } else {
> +               prev_mode = mode;
> +            }
> +         }
> +      }
> +   }
> +
> +   if (progress)
> +      invalidate_live_intervals();
> +
> +   return progress;
> +}
> +
>  static void
>  clear_deps_for_inst_src(fs_inst *inst, bool *deps, int first_grf, int
> grf_len)
>  {
> @@ -5748,6 +5784,7 @@ fs_visitor::optimize()
>     int pass_num = 0;
>
>     OPT(opt_drop_redundant_mov_to_flags);
> +   OPT(remove_extra_rounding_modes);
>
>     do {
>        progress = false;
> diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h
> index f1ba193de7..b9476e69ed 100644
> --- a/src/intel/compiler/brw_fs.h
> +++ b/src/intel/compiler/brw_fs.h
> @@ -150,6 +150,7 @@ public:
>     bool eliminate_find_live_channel();
>     bool dead_code_eliminate();
>     bool remove_duplicate_mrf_writes();
> +   bool remove_extra_rounding_modes();
>
>     bool opt_sampler_eot();
>     bool virtual_grf_interferes(int a, int b);
> --
> 2.13.5
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170911/11cf0cb2/attachment.html>


More information about the mesa-dev mailing list