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:
Connor Abbott 2015-06-06 10:55:21 -04:00
parent 486268bdb0
commit 45cd76e342
4 changed files with 36 additions and 10 deletions

View file

@ -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

View file

@ -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;
} }

View file

@ -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

View file

@ -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);
} }