[Mesa-dev] [PATCH 2/2] panfrost/midgard: Preview for data hazards
Tomeu Vizoso
tomeu at tomeuvizoso.net
Fri Mar 1 13:47:55 UTC 2019
Cannot really review this myself, but:
Tested-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Thanks!
On Wed, 27 Feb 2019 at 06:49, Alyssa Rosenzweig <alyssa at rosenzweig.io> wrote:
>
> If a selected unit causes a data hazard, the whole block gets cut short.
> So, we preview for data hazards _while_ selecting units.
>
> Signed-off-by: Alyssa Rosenzweig <alyssa at rosenzweig.io>
> ---
> .../panfrost/midgard/midgard_compile.c | 25 ++++++++++++-------
> 1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/src/gallium/drivers/panfrost/midgard/midgard_compile.c b/src/gallium/drivers/panfrost/midgard/midgard_compile.c
> index e37037ac737..f9bd611f789 100644
> --- a/src/gallium/drivers/panfrost/midgard/midgard_compile.c
> +++ b/src/gallium/drivers/panfrost/midgard/midgard_compile.c
> @@ -2060,6 +2060,20 @@ can_run_concurrent_ssa(midgard_instruction *first, midgard_instruction *second)
> return true;
> }
>
> +static bool
> +midgard_has_hazard(
> + midgard_instruction **segment, unsigned segment_size,
> + midgard_instruction *ains)
> +{
> + for (int s = 0; s < segment_size; ++s)
> + if (!can_run_concurrent_ssa(segment[s], ains))
> + return true;
> +
> + return false;
> +
> +
> +}
> +
> /* Schedules, but does not emit, a single basic block. After scheduling, the
> * final tag and size of the block are known, which are necessary for branching
> * */
> @@ -2159,7 +2173,7 @@ schedule_bundle(compiler_context *ctx, midgard_block *block, midgard_instruction
> else
> break;
> } else {
> - if ((units & UNIT_SADD) && !(control & UNIT_SADD))
> + if ((units & UNIT_SADD) && !(control & UNIT_SADD) && !midgard_has_hazard(segment, segment_size, ains))
> unit = UNIT_SADD;
> else if (units & UNIT_SMUL)
> unit = ((units & UNIT_VMUL) && !(control & UNIT_VMUL)) ? UNIT_VMUL : UNIT_SMUL;
> @@ -2180,14 +2194,7 @@ schedule_bundle(compiler_context *ctx, midgard_block *block, midgard_instruction
> if (last_unit < UNIT_VADD && unit >= UNIT_VADD)
> segment_size = 0;
>
> - /* Check for data hazards */
> - int has_hazard = false;
> -
> - for (int s = 0; s < segment_size; ++s)
> - if (!can_run_concurrent_ssa(segment[s], ains))
> - has_hazard = true;
> -
> - if (has_hazard)
> + if (midgard_has_hazard(segment, segment_size, ains))
> break;
>
> /* We're good to go -- emit the instruction */
> --
> 2.20.1
>
> _______________________________________________
> 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