[Mesa-dev] [PATCH 2/4] nvc0/ir: don't dual issue instructions which depend on each other
karol herbst
karolherbst at gmail.com
Sat Aug 13 17:24:06 UTC 2016
2016-08-13 18:17 GMT+02:00 Ilia Mirkin <imirkin at alum.mit.edu>:
> On Sat, Aug 13, 2016 at 6:02 AM, Karol Herbst <karolherbst at gmail.com> wrote:
>> no changes without a dual_issue pass
>>
>> changes with for ./GpuTest /test=pixmark_piano /benchmark /no_scorebox /msaa=0
>> /benchmark_duration_ms=60000 /width=1024 /height=640:
>>
>> inst_executed: 1.03G
>> inst_issued1: 538M -> 535M
>> inst_issued2: 251M -> 254M
>>
>> score: 1038 -> 1052
>>
>> Signed-off-by: Karol Herbst <karolherbst at gmail.com>
>> ---
>> src/gallium/drivers/nouveau/codegen/nv50_ir.cpp | 11 +++++++++--
>> src/gallium/drivers/nouveau/codegen/nv50_ir.h | 1 +
>> src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp | 4 ++++
>> 3 files changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
>> index 179ad0b..7a90cb7 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
>> @@ -893,12 +893,19 @@ insnCheckCommutationDefDef(const Instruction *a, const Instruction *b)
>> bool
>> Instruction::isCommutationLegal(const Instruction *i) const
>> {
>> - bool ret = insnCheckCommutationDefDef(this, i);
>> - ret = ret && insnCheckCommutationDefSrc(this, i);
>> + bool ret = !i->dependsOn(this);
>> ret = ret && insnCheckCommutationDefSrc(i, this);
>
> This condition is covered by your new dependsOn() call. Did you mean
> dependsOn to have something different? I haven't really thought
> carefully about this yet.
dependsOn should just check whether the second instruction depend on
the first one, where isCommutationLegal also checks if you could swap
both.
mad $r1 $r2 $r3 $r4
add $r4 $r2 $r2
=>
add.isCommutationLegal(mad) : false
add.dependsOn(mad) : false
those instructions can be dual issued, but the isCommutationLegal
method was too strict about the check.
I hope this is enough to clear it up.
>
>> return ret;
>> }
>>
>> +bool
>> +Instruction::dependsOn(const Instruction *i) const
>> +{
>> + bool ret = insnCheckCommutationDefDef(this, i);
>> + ret = ret && insnCheckCommutationDefSrc(i, this);
>> + return !ret;
>> +}
>> +
>> TexInstruction::TexInstruction(Function *fn, operation op)
>> : Instruction(fn, op, TYPE_F32)
>> {
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
>> index 6d2ee8b..d81fca9 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
>> @@ -831,6 +831,7 @@ public:
>> bool isDead() const;
>> bool isNop() const;
>> bool isCommutationLegal(const Instruction *) const; // must be adjacent !
>> + bool dependsOn(const Instruction *) const; // weaker form of isCommutationLegal
>> bool isActionEqual(const Instruction *) const;
>> bool isResultEqual(const Instruction *) const;
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
>> index faf2121..8ce8c19 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
>> @@ -620,6 +620,10 @@ bool TargetNVC0::canDualIssue(const Instruction *a, const Instruction *b) const
>> // not if the 2nd instruction isn't necessarily executed
>> if (clA == OPCLASS_TEXTURE || clA == OPCLASS_FLOW)
>> return false;
>> +
>> + if (b->dependsOn(a))
>> + return false;
>> +
>> // anything with MOV
>> if (a->op == OP_MOV || b->op == OP_MOV)
>> return true;
>> --
>> 2.9.2
>>
>> _______________________________________________
>> 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