[Mesa-dev] [PATCH] gm107/ir: use CS2R for SV_CLOCK

Karol Herbst kherbst at redhat.com
Tue Jul 17 12:09:09 UTC 2018


that seems like a good enough improvement. I think looking onto other
sysvals would be worthwhile as SV_CLOCK isn't used that often. The
invocation ID and related ones would be interesting to look into as
they are much more common.

On Tue, Jul 17, 2018 at 1:59 PM, Rhys Perry <pendingchaos02 at gmail.com> wrote:
> I'm getting ~28 cycles for the S2R and ~6 cycles (unsurprisingly) for the CS2R.
>
> nvcc with SM30 seems to use the same instruction as the nvc0 emission code.
>
> The SV_LANE* system values don't work with CS2R and I haven't looked
> too deeply into the others.
>
> On Tue, Jul 17, 2018 at 12:13 PM, Karol Herbst <kherbst at redhat.com> wrote:
>> interesting, do you have some numbers on that? Wondering if we could
>> switch more sysvals over to it and what about older gens?
>>
>> On Tue, Jul 17, 2018 at 12:46 PM, Rhys Perry <pendingchaos02 at gmail.com> wrote:
>>> This instruction seems to be faster than S2R and requires no barrier,
>>> though the range of special registers it can read from is limited.
>>>
>>> Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
>>> ---
>>>  src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 14 +++++++++++++-
>>>  .../drivers/nouveau/codegen/nv50_ir_target_gm107.cpp       |  4 +++-
>>>  2 files changed, 16 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
>>> index 694d1b10a3..c306a4680b 100644
>>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
>>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
>>> @@ -124,6 +124,7 @@ private:
>>>
>>>     void emitMOV();
>>>     void emitS2R();
>>> +   void emitCS2R();
>>>     void emitF2F();
>>>     void emitF2I();
>>>     void emitI2F();
>>> @@ -749,6 +750,14 @@ CodeEmitterGM107::emitS2R()
>>>     emitGPR (0x00, insn->def(0));
>>>  }
>>>
>>> +void
>>> +CodeEmitterGM107::emitCS2R()
>>> +{
>>> +   emitInsn(0x50c80000);
>>> +   emitSYS (0x14, insn->src(0));
>>> +   emitGPR (0x00, insn->def(0));
>>> +}
>>> +
>>>  void
>>>  CodeEmitterGM107::emitF2F()
>>>  {
>>> @@ -3192,7 +3201,10 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
>>>        emitMOV();
>>>        break;
>>>     case OP_RDSV:
>>> -      emitS2R();
>>> +      if (insn->getSrc(0)->reg.data.id == SV_CLOCK)
>>> +         emitCS2R();
>>> +      else
>>> +         emitS2R();
>>>        break;
>>>     case OP_ABS:
>>>     case OP_NEG:
>>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp
>>> index 04cbd402a1..009470fb93 100644
>>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp
>>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp
>>> @@ -153,9 +153,10 @@ TargetGM107::isBarrierRequired(const Instruction *insn) const
>>>        case OP_AFETCH:
>>>        case OP_PFETCH:
>>>        case OP_PIXLD:
>>> -      case OP_RDSV:
>>>        case OP_SHFL:
>>>           return true;
>>> +      case OP_RDSV:
>>> +         return insn->getSrc(0)->reg.data.id != SV_CLOCK;
>>>        default:
>>>           break;
>>>        }
>>> @@ -229,6 +230,7 @@ TargetGM107::getLatency(const Instruction *insn) const
>>>     case OP_SUB:
>>>     case OP_VOTE:
>>>     case OP_XOR:
>>> +   case OP_RDSV:
>>>        if (insn->dType != TYPE_F64)
>>>           return 6;
>>>        break;
>>> --
>>> 2.14.4
>>>


More information about the mesa-dev mailing list