[Mesa-dev] [PATCH v3 12/44] i965: Calculate appropriate L3 partition weights for the current pipeline state.

Samuel Iglesias Gonsálvez siglesias at igalia.com
Tue Dec 1 05:27:36 PST 2015


Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>

On 01/12/15 09:19, Jordan Justen wrote:
> From: Francisco Jerez <currojerez at riseup.net>
> 
> This calculates a rather conservative partitioning of the L3 cache
> based on the shaders currently bound to the pipeline and whether they
> use SLM, atomics, images or scratch space.  The result is intended to
> be fine-tuned later on based on other pipeline state.
> ---
>  src/mesa/drivers/dri/i965/brw_compiler.h  |  1 +
>  src/mesa/drivers/dri/i965/gen7_l3_state.c | 53 +++++++++++++++++++++++++++++++
>  2 files changed, 54 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h b/src/mesa/drivers/dri/i965/brw_compiler.h
> index 1ee01eb..6795225 100644
> --- a/src/mesa/drivers/dri/i965/brw_compiler.h
> +++ b/src/mesa/drivers/dri/i965/brw_compiler.h
> @@ -300,6 +300,7 @@ struct brw_stage_prog_data {
>  
>     unsigned curb_read_length;
>     unsigned total_scratch;
> +   unsigned total_shared;
>  
>     /**
>      * Register where the thread expects to find input data from the URB
> diff --git a/src/mesa/drivers/dri/i965/gen7_l3_state.c b/src/mesa/drivers/dri/i965/gen7_l3_state.c
> index c31e38c..0b5e231 100644
> --- a/src/mesa/drivers/dri/i965/gen7_l3_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_l3_state.c
> @@ -258,6 +258,59 @@ get_l3_config(const struct brw_device_info *devinfo, struct brw_l3_weights w0)
>  }
>  
>  /**
> + * Return a reasonable default L3 configuration for the specified device based
> + * on whether SLM and DC are required.  In the non-SLM non-DC case the result
> + * is intended to approximately resemble the hardware defaults.
> + */
> +static struct brw_l3_weights
> +get_default_l3_weights(const struct brw_device_info *devinfo,
> +                       bool needs_dc, bool needs_slm)
> +{
> +   struct brw_l3_weights w = {{ 0 }};
> +
> +   w.w[L3P_SLM] = needs_slm;
> +   w.w[L3P_URB] = 1.0;
> +
> +   if (devinfo->gen >= 8) {
> +      w.w[L3P_ALL] = 1.0;
> +   } else {
> +      w.w[L3P_DC] = needs_dc ? 0.1 : 0;
> +      w.w[L3P_RO] = devinfo->is_baytrail ? 0.5 : 1.0;
> +   }
> +
> +   return norm_l3_weights(w);
> +}
> +
> +/**
> + * Calculate the desired L3 partitioning based on the current state of the
> + * pipeline.  For now this simply returns the conservative defaults calculated
> + * by get_default_l3_weights(), but we could probably do better by gathering
> + * more statistics from the pipeline state (e.g. guess of expected URB usage
> + * and bound surfaces), or by using feed-back from performance counters.
> + */
> +static struct brw_l3_weights
> +get_pipeline_state_l3_weights(const struct brw_context *brw)
> +{
> +   const struct brw_stage_state *stage_states[] = {
> +      &brw->vs.base, &brw->gs.base, &brw->wm.base, &brw->cs.base
> +   };
> +   bool needs_dc = false, needs_slm = false;
> +
> +   for (unsigned i = 0; i < ARRAY_SIZE(stage_states); i++) {
> +      const struct gl_shader_program *prog =
> +         brw->ctx._Shader->CurrentProgram[stage_states[i]->stage];
> +      const struct brw_stage_prog_data *prog_data = stage_states[i]->prog_data;
> +
> +      needs_dc |= (prog && prog->NumAtomicBuffers) ||
> +         (prog_data && (prog_data->total_scratch || prog_data->nr_image_params));
> +      needs_slm |= prog_data && prog_data->total_shared;
> +   }
> +
> +   return get_default_l3_weights(brw->intelScreen->devinfo,
> +                                 needs_dc, needs_slm);
> +}
> +
> +/**
>   * Program the hardware to use the specified L3 configuration.
>   */
>  static void
> 


More information about the mesa-dev mailing list