[Mesa-dev] [PATCH] i965/fs: Take into account lower frequency of conditional blocks in spilling cost heuristic.
Kenneth Graunke
kenneth at whitecape.org
Tue Apr 11 05:43:39 UTC 2017
On Monday, April 10, 2017 5:23:20 PM PDT Francisco Jerez wrote:
> The individual branches of an if/else/endif construct will be executed
> some unknown number of times between 0 and 1 relative to the parent
> block. Use some factor in between as weight while approximating the
> cost of spill/fill instructions within a conditional if-else branch.
> This favors spilling registers used within conditional branches which
> are likely to be executed less frequently than registers used at the
> top level.
>
> Improves the framerate of the SynMark2 OglCSDof benchmark by ~1.9x on
> my SKL GT4e. Should have a comparable effect on other platforms. No
> significant regressions.
> ---
> src/intel/compiler/brw_fs_reg_allocate.cpp | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/src/intel/compiler/brw_fs_reg_allocate.cpp b/src/intel/compiler/brw_fs_reg_allocate.cpp
> index 5c6f3d4..c981d72 100644
> --- a/src/intel/compiler/brw_fs_reg_allocate.cpp
> +++ b/src/intel/compiler/brw_fs_reg_allocate.cpp
> @@ -806,7 +806,7 @@ emit_spill(const fs_builder &bld, fs_reg src,
> int
> fs_visitor::choose_spill_reg(struct ra_graph *g)
> {
> - float loop_scale = 1.0;
> + float block_scale = 1.0;
> float spill_costs[this->alloc.count];
> bool no_spill[this->alloc.count];
>
> @@ -822,23 +822,32 @@ fs_visitor::choose_spill_reg(struct ra_graph *g)
> foreach_block_and_inst(block, fs_inst, inst, cfg) {
> for (unsigned int i = 0; i < inst->sources; i++) {
> if (inst->src[i].file == VGRF)
> - spill_costs[inst->src[i].nr] += loop_scale;
> + spill_costs[inst->src[i].nr] += block_scale;
> }
>
> if (inst->dst.file == VGRF)
> spill_costs[inst->dst.nr] += DIV_ROUND_UP(inst->size_written, REG_SIZE)
> - * loop_scale;
> + * block_scale;
>
> switch (inst->opcode) {
>
> case BRW_OPCODE_DO:
> - loop_scale *= 10;
> + block_scale *= 10;
> break;
>
> case BRW_OPCODE_WHILE:
> - loop_scale /= 10;
> + block_scale /= 10;
> break;
>
> + case BRW_OPCODE_IF:
> + case BRW_OPCODE_IFF:
> + block_scale *= 0.5;
> + break;
> +
> + case BRW_OPCODE_ENDIF:
> + block_scale /= 0.5;
> + break;
> +
> case SHADER_OPCODE_GEN4_SCRATCH_WRITE:
> if (inst->src[0].file == VGRF)
> no_spill[inst->src[0].nr] = true;
>
Makes sense, nice simple improvement!
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170410/a8093375/attachment.sig>
More information about the mesa-dev
mailing list