[Mesa-dev] [PATCH 05/22] i965/fs: consider execsize can be duplicated in lower_simd_with

Juan A. Suarez Romero jasuarez at igalia.com
Tue Jan 10 12:43:37 UTC 2017


On Mon, 2017-01-09 at 15:41 -0800, Francisco Jerez wrote:
> Samuel Iglesias Gonsálvez <siglesias at igalia.com> writes:
> 
> > From: "Juan A. Suarez Romero" <jasuarez at igalia.com>
> > 
> > In IVB/VLV, for instructions dealing with DF, execsize will be
> > duplicated in the final code.
> > 
> > So take this in account when checking if instructions should be
> > split.
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs.cpp | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> > b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > index 78f2124..cfce364 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > @@ -4551,8 +4551,15 @@ static unsigned
> >  get_fpu_lowered_simd_width(const struct gen_device_info *devinfo,
> >                             const fs_inst *inst)
> >  {
> > +   /* Note that in IVB/VLV for instructions that handles DF, we
> > will duplicate
> > +    * the exec_size. So take this value for calculus purposes.
> > +    */
> > +   unsigned exec_size = inst->exec_size;
> > +   if (devinfo->gen == 7 && !devinfo->is_haswell && inst-
> > >exec_data_size() == 8)
> > +      exec_size *= 2;
> > +
> 
> NAK.  This won't have any useful effect because the max_width value
> doesn't actually have any influence in the regioning restriction
> calculations below, it's only used to accumulate the intermediate
> execution size limits derived from each hardware restriction.  I
> don't
> think you need to change any of the restrictions below for the result
> to
> be correct in presence of exec size doubling.



Yes, you're right.

Actually the motivation for the patch was to avoid ending up with a
final exec_size > 8  (after doubling it in the generator) when we are
generating a SIMD8 shader (or exec_size > 16 in SIMD16 shader).

So if we have a exec_size == 8, and we are generating SIMD8 code, then
we want to split in two instructions of exec_size==4, because at the
end we will double the exec_size to 8. Same reasoning with SIMD16 code.


This could be done as:

@@ -5119,7 +5119,11 @@ fs_visitor::lower_simd_width()
    bool progress = false;
 
    foreach_block_and_inst_safe(block, fs_inst, inst, cfg) {
-      const unsigned lower_width = get_lowered_simd_width(devinfo,
inst);
+      unsigned lower_width = get_lowered_simd_width(devinfo, inst);
+
+      if (devinfo->gen == 7 && !devinfo->is_haswell &&
+          (get_exec_type_size(inst) == 8 || type_sz(inst->dst.type) ==
8))
+         lower_width = MIN2(lower_width, dispatch_width / 2);


Now, this is all in theory. So far, no test has exposed this
situation with this change of top of our branch, and the lower_width
returned by get_lowered_simd_width() is always less than 8. But maybe
this could happen in future, for instance, if we emit an instruction
that writes more than 4 DF and has force_writemask_all == TRUE.

> 
> >     /* Maximum execution size representable in the instruction controls. */
> > -   unsigned max_width = MIN2(32, inst->exec_size);
> > +   unsigned max_width = MIN2(32, exec_size);
> >  
> >     /* According to the PRMs:
> >      *  "A. In Direct Addressing mode, a source cannot span more than 2
> > @@ -4656,6 +4663,10 @@ get_fpu_lowered_simd_width(const struct gen_device_info *devinfo,
> >           max_width = MIN2(max_width, channels_per_grf);
> >     }
> >  
> > +   /* If we have duplicated exec_size, then readjust max_width if required. */
> > +   if (exec_size != inst->exec_size && max_width == exec_size)
> > +      max_width = inst->exec_size;
> > +
> >     /* Only power-of-two execution sizes are representable in the instruction
> >      * control fields.
> >      */
> > -- 
> > 2.9.3
> > 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list