[Mesa-dev] [PATCH 2/4] nvc0/ir: don't dual issue instructions which depend on each other
Tobias Klausmann
tobias.johannes.klausmann at mni.thm.de
Sat Aug 13 15:43:30 UTC 2016
On 13.08.2016 12:02, Karol Herbst 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);
> 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;
Reviewed-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
More information about the mesa-dev
mailing list