[Mesa-dev] [PATCH v3 21/42] intel/compiler: set correct precision fields for 3-source float instructions

Iago Toral itoral at igalia.com
Mon Jan 21 09:17:33 UTC 2019


On Fri, 2019-01-18 at 06:54 -0600, Jason Ekstrand wrote:
> 
> 
> 
> 
> 
> On January 18, 2019 04:47:51 Iago Toral <itoral at igalia.com> wrote:
> > On Thu, 2019-01-17 at 14:18 -0600, Jason Ekstrand wrote:
> > > On Tue, Jan 15, 2019 at 7:55 AM Iago Toral Quiroga <
> > > itoral at igalia.com> wrote:
> > > > Source0 and Destination extract the floating-point precision
> > > > automatically
> > > > 
> > > > from the SrcType and DstType instruction fields respectively
> > > > when they are
> > > > 
> > > > set to types :F or :HF. For Source1 and Source2 operands, we
> > > > use the new
> > > > 
> > > > 1-bit fields Src1Type and Src2Type, where 0 means normal
> > > > precision and 1
> > > > 
> > > > means half-precision. Since we always use the type of the
> > > > destination for
> > > > 
> > > > all operands when we emit 3-source instructions, we only need
> > > > set Src1Type
> > > > 
> > > > and Src2Type to 1 when we are emitting a half-precision
> > > > instruction.
> > > > 
> > > > 
> > > > 
> > > > v2:
> > > > 
> > > >  - Set the bit separately for each source based on its type so
> > > > we can
> > > > 
> > > >    do mixed floating-point mode in the future (Topi).
> > > > 
> > > > 
> > > > 
> > > > Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> > > > 
> > > > ---
> > > > 
> > > >  src/intel/compiler/brw_eu_emit.c | 16 ++++++++++++++++
> > > > 
> > > >  1 file changed, 16 insertions(+)
> > > > 
> > > > 
> > > > 
> > > > diff --git a/src/intel/compiler/brw_eu_emit.c
> > > > b/src/intel/compiler/brw_eu_emit.c
> > > > 
> > > > index a785f96b650..2fa89f8a2a3 100644
> > > > 
> > > > --- a/src/intel/compiler/brw_eu_emit.c
> > > > 
> > > > +++ b/src/intel/compiler/brw_eu_emit.c
> > > > 
> > > > @@ -801,6 +801,22 @@ brw_alu3(struct brw_codegen *p, unsigned
> > > > opcode, struct brw_reg dest,
> > > > 
> > > >            */
> > > > 
> > > >           brw_inst_set_3src_a16_src_type(devinfo, inst,
> > > > dest.type);
> > > > 
> > > >           brw_inst_set_3src_a16_dst_type(devinfo, inst,
> > > > dest.type);
> > > > 
> > > > +
> > > > 
> > > > +         /* From the Bspec: Instruction types
> > > > 
> > > > +          *
> > > > 
> > > > +          * Three source instructions can use operands with
> > > > mixed-mode
> > > > 
> > > > +          * precision. When SrcType field is set to :f or :hf
> > > > it defines
> > > > 
> > > > +          * precision for source 0 only, and fields Src1Type
> > > > and Src2Type
> > > > 
> > > > +          * define precision for other source operands:
> > > > 
> > > > +          *
> > > > 
> > > > +          *   0b = :f. Single precision Float (32-bit).
> > > > 
> > > > +          *   1b = :hf. Half precision Float (16-bit).
> > > > 
> > > > +          */
> > > > 
> > > > +         if (src1.type == BRW_REGISTER_TYPE_HF)
> > > > 
> > > > +            brw_inst_set_3src_a16_src1_type(devinfo, inst, 1);
> > > 
> > > Maybe worth throwing in an
> > > 
> > > assert(src0.type == BRW_REGISTER_TYPE_F || src0.type ==
> > > BRW_REGISTER_TYPE_HF);
> > > 
> > > just to be sure? 
> > 
> > If we are going to do this I guess we should also check the same
> > for src2.
> 
> Yeah, it'd probably be good to have a general assertion that the
> three sources have the same type with the caveat that they can vary
> to mix half and full float.  Maybe that would be better than
> something specific right here.

Actually, I don't think that is going to work. There is this comment
right above this hunk:
         /* Set both the source and destination types based on
dest.type,          * ignoring the source register types.  The MAD and
LRP emitters ensure          * that all four types are float.  The BFE
and BFI2 emitters, however,          * may send us mixed D and UD types
and want us to ignore that and use          * the destination
type.          */
I guess we could still formulate a readable assertion using helpers,
something like this:
assert(all_types_32bit_integer(src0.type, src1.type, src2.type)
||           all_types_mixed_float(src0.type, src1.type, src2.type)
||           all_types_64bit_float(src0.type, src1.type, src2.type));
but creating 3 helpers only for one assertion might a bit excessive...
so maybe just adding the specific asserts for src1 and src2 when they
are HF is more reasonable?
> > >  Either way, this and patch 20 are
> > > Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
> > >  
> > > > +
> > > > 
> > > > +         if (src2.type == BRW_REGISTER_TYPE_HF)
> > > > 
> > > > +            brw_inst_set_3src_a16_src2_type(devinfo, inst, 1);
> > > > 
> > > >        }
> > 
> > And the same here (for src0 and src1)
> > > >     }
> > > > 
> > > > 
> > > > 
> 
> 
> 
> 
> 
> 
> 
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190121/7e36d0f8/attachment.html>


More information about the mesa-dev mailing list