mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 22:20:14 +01:00
i965: dump scheduling cycle estimates
The heuristic we're using is rather lame, since it assumes everything is non-uniform and loops execute 10 times, but it should be enough for measuring improvements in the scheduler that don't result in a change in the number of instructions. v2: - Switch loops and cycle counts to be compatible with older shader-db. - Make loop heuristic 10x to match with spilling code. Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
486268bdb0
commit
45cd76e342
4 changed files with 36 additions and 10 deletions
|
|
@ -90,6 +90,8 @@ struct bblock_t {
|
||||||
struct exec_list parents;
|
struct exec_list parents;
|
||||||
struct exec_list children;
|
struct exec_list children;
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
|
unsigned cycle_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct backend_instruction *
|
static inline struct backend_instruction *
|
||||||
|
|
@ -285,6 +287,8 @@ struct cfg_t {
|
||||||
int num_blocks;
|
int num_blocks;
|
||||||
|
|
||||||
bool idom_dirty;
|
bool idom_dirty;
|
||||||
|
|
||||||
|
unsigned cycle_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Note that this is implemented with a double for loop -- break will
|
/* Note that this is implemented with a double for loop -- break will
|
||||||
|
|
|
||||||
|
|
@ -2269,9 +2269,9 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
|
||||||
|
|
||||||
if (unlikely(debug_flag)) {
|
if (unlikely(debug_flag)) {
|
||||||
fprintf(stderr, "Native code for %s\n"
|
fprintf(stderr, "Native code for %s\n"
|
||||||
"SIMD%d shader: %d instructions. %d loops. %d:%d spills:fills. Promoted %u constants. Compacted %d to %d"
|
"SIMD%d shader: %d instructions. %d loops. %u cycles. %d:%d spills:fills. Promoted %u constants. Compacted %d to %d"
|
||||||
" bytes (%.0f%%)\n",
|
" bytes (%.0f%%)\n",
|
||||||
shader_name, dispatch_width, before_size / 16, loop_count,
|
shader_name, dispatch_width, before_size / 16, loop_count, cfg->cycle_count,
|
||||||
spill_count, fill_count, promoted_constants, before_size, after_size,
|
spill_count, fill_count, promoted_constants, before_size, after_size,
|
||||||
100.0f * (before_size - after_size) / before_size);
|
100.0f * (before_size - after_size) / before_size);
|
||||||
|
|
||||||
|
|
@ -2281,12 +2281,13 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
|
||||||
}
|
}
|
||||||
|
|
||||||
compiler->shader_debug_log(log_data,
|
compiler->shader_debug_log(log_data,
|
||||||
"%s SIMD%d shader: %d inst, %d loops, "
|
"%s SIMD%d shader: %d inst, %d loops, %u cycles, "
|
||||||
"%d:%d spills:fills, Promoted %u constants, "
|
"%d:%d spills:fills, Promoted %u constants, "
|
||||||
"compacted %d to %d bytes.\n",
|
"compacted %d to %d bytes.\n",
|
||||||
stage_abbrev, dispatch_width, before_size / 16,
|
stage_abbrev, dispatch_width, before_size / 16,
|
||||||
loop_count, spill_count, fill_count,
|
loop_count, cfg->cycle_count, spill_count,
|
||||||
promoted_constants, before_size, after_size);
|
fill_count, promoted_constants, before_size,
|
||||||
|
after_size);
|
||||||
|
|
||||||
return start_offset;
|
return start_offset;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1467,6 +1467,24 @@ instruction_scheduler::schedule_instructions(bblock_t *block)
|
||||||
if (block->end()->opcode == BRW_OPCODE_NOP)
|
if (block->end()->opcode == BRW_OPCODE_NOP)
|
||||||
block->end()->remove(block);
|
block->end()->remove(block);
|
||||||
assert(instructions_to_schedule == 0);
|
assert(instructions_to_schedule == 0);
|
||||||
|
|
||||||
|
block->cycle_count = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned get_cycle_count(cfg_t *cfg)
|
||||||
|
{
|
||||||
|
unsigned count = 0, multiplier = 1;
|
||||||
|
foreach_block(block, cfg) {
|
||||||
|
if (block->start()->opcode == BRW_OPCODE_DO)
|
||||||
|
multiplier *= 10; /* assume that loops execute ~10 times */
|
||||||
|
|
||||||
|
count += block->cycle_count * multiplier;
|
||||||
|
|
||||||
|
if (block->end()->opcode == BRW_OPCODE_WHILE)
|
||||||
|
multiplier /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1507,6 +1525,8 @@ instruction_scheduler::run(cfg_t *cfg)
|
||||||
post_reg_alloc);
|
post_reg_alloc);
|
||||||
bs->dump_instructions();
|
bs->dump_instructions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfg->cycle_count = get_cycle_count(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -1558,10 +1558,10 @@ generate_code(struct brw_codegen *p,
|
||||||
nir->info.label ? nir->info.label : "unnamed",
|
nir->info.label ? nir->info.label : "unnamed",
|
||||||
_mesa_shader_stage_to_string(nir->stage), nir->info.name);
|
_mesa_shader_stage_to_string(nir->stage), nir->info.name);
|
||||||
|
|
||||||
fprintf(stderr, "%s vec4 shader: %d instructions. %d loops. Compacted %d to %d"
|
fprintf(stderr, "%s vec4 shader: %d instructions. %d loops. %u cycles."
|
||||||
" bytes (%.0f%%)\n",
|
"Compacted %d to %d bytes (%.0f%%)\n",
|
||||||
stage_abbrev,
|
stage_abbrev,
|
||||||
before_size / 16, loop_count, before_size, after_size,
|
before_size / 16, loop_count, cfg->cycle_count, before_size, after_size,
|
||||||
100.0f * (before_size - after_size) / before_size);
|
100.0f * (before_size - after_size) / before_size);
|
||||||
|
|
||||||
dump_assembly(p->store, annotation.ann_count, annotation.ann,
|
dump_assembly(p->store, annotation.ann_count, annotation.ann,
|
||||||
|
|
@ -1570,9 +1570,10 @@ generate_code(struct brw_codegen *p,
|
||||||
}
|
}
|
||||||
|
|
||||||
compiler->shader_debug_log(log_data,
|
compiler->shader_debug_log(log_data,
|
||||||
"%s vec4 shader: %d inst, %d loops, "
|
"%s vec4 shader: %d inst, %d loops, %u cycles, "
|
||||||
"compacted %d to %d bytes.\n",
|
"compacted %d to %d bytes.\n",
|
||||||
stage_abbrev, before_size / 16, loop_count,
|
stage_abbrev, before_size / 16,
|
||||||
|
loop_count, cfg->cycle_count,
|
||||||
before_size, after_size);
|
before_size, after_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue