void core_fetch_STM_t::reg_stats(struct stat_sdb_t * const sdb) { char buf[1024]; char buf2[1024]; struct thread_t * arch = core->current_thread; stat_reg_note(sdb,"\n#### BPRED STATS ####"); bpred->reg_stats(sdb,core); stat_reg_note(sdb,"\n#### INST CACHE STATS ####"); cache_reg_stats(sdb, core, core->memory.IL1); cache_reg_stats(sdb, core, core->memory.ITLB); stat_reg_note(sdb,"\n#### FETCH STATS ####"); sprintf(buf,"c%d.fetch_insn",arch->id); stat_reg_counter(sdb, true, buf, "total number of instructions fetched", &core->stat.fetch_insn, 0, TRUE, NULL); sprintf(buf,"c%d.fetch_uops",arch->id); stat_reg_counter(sdb, true, buf, "total number of uops fetched", &core->stat.fetch_uops, 0, TRUE, NULL); sprintf(buf,"c%d.fetch_IPC",arch->id); sprintf(buf2,"c%d.fetch_insn/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "IPC at fetch", buf2, NULL); sprintf(buf,"c%d.fetch_uPC",arch->id); sprintf(buf2,"c%d.fetch_uops/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uPC at fetch", buf2, NULL); sprintf(buf,"c%d.fetch_stall",core->current_thread->id); core->stat.fetch_stall = stat_reg_dist(sdb, buf, "breakdown of stalls in fetch", /* initial value */0, /* array size */FSTALL_num, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */fetch_stall_str, /* scale_me */ TRUE, /* print fn */NULL); sprintf(buf,"c%d.byteQ_occupancy",arch->id); stat_reg_counter(sdb, false, buf, "total byteQ occupancy (in lines/entries)", &core->stat.byteQ_occupancy, 0, TRUE, NULL); sprintf(buf,"c%d.byteQ_avg",arch->id); sprintf(buf2,"c%d.byteQ_occupancy/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average byteQ occupancy (in insts)", buf2, NULL); }
/* register simulator-specific statistics */ void sim_reg_stats(struct stat_sdb_t *sdb) { int i; stat_reg_counter(sdb, "sim_num_insn", "total number of instructions executed", &sim_num_insn, sim_num_insn, NULL); stat_reg_counter(sdb, "sim_num_refs", "total number of loads and stores executed", &sim_num_refs, 0, NULL); stat_reg_int(sdb, "sim_elapsed_time", "total simulation time in seconds", &sim_elapsed_time, 0, NULL); stat_reg_formula(sdb, "sim_inst_rate", "simulation speed (in insts/sec)", "sim_num_insn / sim_elapsed_time", NULL); if (prof_ic) { /* instruction class profile */ ic_prof = stat_reg_dist(sdb, "sim_inst_class_prof", "instruction class profile", /* initial value */0, /* array size */ic_NUM, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */inst_class_str, /* print fn */NULL); } if (prof_inst) { int i; char buf[512]; /* conjure up appropriate instruction description strings */ for (i=0; i < /* skip NA */OP_MAX-1; i++) { sprintf(buf, "%-8s %-6s", md_op2name[i+1], md_op2format[i+1]); inst_str[i] = mystrdup(buf); } /* instruction profile */ inst_prof = stat_reg_dist(sdb, "sim_inst_prof", "instruction profile", /* initial value */0, /* array size */ /* skip NA */OP_MAX-1, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */inst_str, /* print fn */NULL); } if (prof_bc) { /* instruction branch profile */ bc_prof = stat_reg_dist(sdb, "sim_branch_prof", "branch instruction profile", /* initial value */0, /* array size */bc_NUM, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */branch_class_str, /* print fn */NULL); } if (prof_am) { /* instruction branch profile */ am_prof = stat_reg_dist(sdb, "sim_addr_mode_prof", "addressing mode profile", /* initial value */0, /* array size */md_amode_NUM, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */md_amode_str, /* print fn */NULL); } if (prof_seg) { /* instruction branch profile */ seg_prof = stat_reg_dist(sdb, "sim_addr_seg_prof", "load/store address segment profile", /* initial value */0, /* array size */seg_NUM, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */addr_seg_str, /* print fn */NULL); } if (prof_tsyms && sym_ntextsyms != 0) { int i; /* load program symbols */ sym_loadsyms(ld_prog_fname, load_locals); /* conjure up appropriate instruction description strings */ tsym_names = (char **)calloc(sym_ntextsyms, sizeof(char *)); for (i=0; i < sym_ntextsyms; i++) tsym_names[i] = sym_textsyms[i]->name; /* text symbol profile */ tsym_prof = stat_reg_dist(sdb, "sim_text_sym_prof", "text symbol profile", /* initial value */0, /* array size */sym_ntextsyms, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */tsym_names, /* print fn */NULL); } if (prof_dsyms && sym_ndatasyms != 0) { int i; /* load program symbols */ sym_loadsyms(ld_prog_fname, load_locals); /* conjure up appropriate instruction description strings */ dsym_names = (char **)calloc(sym_ndatasyms, sizeof(char *)); for (i=0; i < sym_ndatasyms; i++) dsym_names[i] = sym_datasyms[i]->name; /* data symbol profile */ dsym_prof = stat_reg_dist(sdb, "sim_data_sym_prof", "data symbol profile", /* initial value */0, /* array size */sym_ndatasyms, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */dsym_names, /* print fn */NULL); } if (prof_taddr) { /* text address profile (sparse profile), NOTE: a dense print format is used, its more difficult to read, but the profiles are *much* smaller, I've assumed that the profiles are read by programs, at least for your sake I hope this is the case!! */ taddr_prof = stat_reg_sdist(sdb, "sim_text_addr_prof", "text address profile", /* initial value */0, /* print format */(PF_COUNT|PF_PDF), /* format */"0x%p %u %.2f", /* print fn */NULL); } for (i=0; i<pcstat_nelt; i++) { char buf[512], buf1[512]; struct stat_stat_t *stat; /* track the named statistical variable by text address */ /* find it... */ stat = stat_find_stat(sdb, pcstat_vars[i]); if (!stat) fatal("cannot locate any statistic named `%s'", pcstat_vars[i]); /* stat must be an integral type */ if (stat->sc != sc_int && stat->sc != sc_uint && stat->sc != sc_counter) fatal("`-pcstat' statistical variable `%s' is not an integral type", stat->name); /* register this stat */ pcstat_stats[i] = stat; pcstat_lastvals[i] = STATVAL(stat); /* declare the sparce text distribution */ sprintf(buf, "%s_by_pc", stat->name); sprintf(buf1, "%s (by text address)", stat->desc); pcstat_sdists[i] = stat_reg_sdist(sdb, buf, buf1, /* initial value */0, /* print format */(PF_COUNT|PF_PDF), /* format */"0x%p %u %.2f", /* print fn */NULL); } ld_reg_stats(sdb); mem_reg_stats(mem, sdb); }
void core_commit_IO_DPM_t::reg_stats(struct stat_sdb_t * const sdb) { char buf[1024]; char buf2[1024]; struct thread_t * arch = core->current_thread; stat_reg_note(sdb,"\n#### COMMIT STATS ####"); sprintf(buf,"c%d.commit_bytes",arch->id); stat_reg_counter(sdb, true, buf, "total number of bytes committed", &core->stat.commit_bytes, 0, TRUE, NULL); sprintf(buf,"c%d.commit_insn",arch->id); stat_reg_counter(sdb, true, buf, "total number of instructions committed", &core->stat.commit_insn, 0, TRUE, NULL); sprintf(buf,"c%d.commit_uops",arch->id); stat_reg_counter(sdb, true, buf, "total number of uops committed", &core->stat.commit_uops, 0, TRUE, NULL); sprintf(buf,"c%d.commit_eff_uops",arch->id); stat_reg_counter(sdb, true, buf, "total number of effective uops committed", &core->stat.commit_eff_uops, 0, TRUE, NULL); sprintf(buf,"c%d.commit_BPC",arch->id); sprintf(buf2,"c%d.commit_bytes/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "BPC (bytes per cycle) at commit", buf2, NULL); sprintf(buf,"c%d.commit_IPC",arch->id); sprintf(buf2,"c%d.commit_insn/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "IPC at commit", buf2, NULL); sprintf(buf,"c%d.commit_uPC",arch->id); sprintf(buf2,"c%d.commit_uops/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uPC at commit", buf2, NULL); sprintf(buf,"c%d.commit_euPC",arch->id); sprintf(buf2,"c%d.commit_eff_uops/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "effective uPC at commit", buf2, NULL); sprintf(buf,"c%d.commit_byte_per_inst",arch->id); sprintf(buf2,"c%d.commit_bytes/c%d.commit_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average bytes per instruction", buf2, NULL); sprintf(buf,"c%d.commit_byte_per_uop",arch->id); sprintf(buf2,"c%d.commit_bytes/c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average bytes per uop", buf2, NULL); sprintf(buf,"c%d.commit_byte_per_eff_uop",arch->id); sprintf(buf2,"c%d.commit_bytes/c%d.commit_eff_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average bytes per effective uop", buf2, NULL); sprintf(buf,"c%d.avg_commit_flowlen",arch->id); sprintf(buf2,"c%d.commit_uops/c%d.commit_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uops per instruction at commit", buf2, NULL); sprintf(buf,"c%d.avg_commit_eff_flowlen",arch->id); sprintf(buf2,"c%d.commit_eff_uops/c%d.commit_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "effective uops per instruction at commit", buf2, NULL); sprintf(buf,"c%d.commit_fusions",arch->id); stat_reg_counter(sdb, true, buf, "total number of fused uops committed", &core->stat.commit_fusions, 0, TRUE, NULL); sprintf(buf,"c%d.commit_fusion_uops",arch->id); sprintf(buf2,"(c%d.commit_eff_uops - c%d.commit_uops) + c%d.commit_fusions",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "fused uops at commit", buf2, "%12.0f"); sprintf(buf,"c%d.commit_frac_fusion_uops",arch->id); sprintf(buf2,"c%d.commit_fusion_uops / c%d.commit_eff_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "fraction of effective uops fused at commit", buf2, NULL); sprintf(buf,"c%d.commit_fusion_compression",arch->id); sprintf(buf2,"(c%d.commit_eff_uops - c%d.commit_uops) / c%d.commit_eff_uops",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "fraction of effective uops compressed via fusion at commit", buf2, NULL); sprintf(buf,"c%d.commit_fusion_expansion",arch->id); sprintf(buf2,"c%d.commit_eff_uops / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average number of effective uops per uop (fused or standalone) commit", buf2, NULL); sprintf(buf,"c%d.commit_dead_lock_flushes",arch->id); stat_reg_counter(sdb, true, buf, "total number of pipe-flushes due to dead-locked pipeline", &core->stat.commit_deadlock_flushes, 0, FALSE, NULL); sprintf(buf,"c%d.ROB_empty",arch->id); sprintf(buf,"c%d.ROB_occupancy",arch->id); stat_reg_counter(sdb, false, buf, "total ROB occupancy", &core->stat.ROB_occupancy, 0, TRUE, NULL); sprintf(buf,"c%d.ROB_eff_occupancy",arch->id); stat_reg_counter(sdb, false, buf, "total ROB effective_occupancy", &core->stat.ROB_eff_occupancy, 0, TRUE, NULL); sprintf(buf,"c%d.ROB_empty",arch->id); stat_reg_counter(sdb, false, buf, "total cycles ROB was empty", &core->stat.ROB_empty_cycles, 0, TRUE, NULL); sprintf(buf,"c%d.ROB_full",arch->id); stat_reg_counter(sdb, false, buf, "total cycles ROB was full", &core->stat.ROB_full_cycles, 0, TRUE, NULL); sprintf(buf,"c%d.ROB_avg",arch->id); sprintf(buf2,"c%d.ROB_occupancy/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average ROB occupancy", buf2, NULL); sprintf(buf,"c%d.ROB_eff_avg",arch->id); sprintf(buf2,"c%d.ROB_eff_occupancy/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average ROB effective occupancy", buf2, NULL); sprintf(buf,"c%d.ROB_frac_empty",arch->id); sprintf(buf2,"c%d.ROB_empty/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "fraction of cycles ROB was empty", buf2, NULL); sprintf(buf,"c%d.ROB_frac_full",arch->id); sprintf(buf2,"c%d.ROB_full/c%d.sim_cycle",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "fraction of cycles ROB was full", buf2, NULL); sprintf(buf,"c%d.DL1_store_split_accesses",arch->id); stat_reg_counter(sdb, true, buf, "number of stores requiring split accesses", &core->stat.DL1_store_split_accesses, 0, TRUE, NULL); sprintf(buf,"c%d.DL1_store_split_frac",arch->id); sprintf(buf2,"c%d.DL1_store_split_accesses/(c%d.DL1.store_lookups-c%d.DL1_store_split_accesses)",arch->id,arch->id,arch->id); /* need to subtract since each split access generated two store accesses */ stat_reg_formula(sdb, true, buf, "fraction of stores requiring split accesses", buf2, NULL); sprintf(buf,"c%d.commit_stall",core->current_thread->id); core->stat.commit_stall = stat_reg_dist(sdb, buf, "breakdown of stalls at commit", /* initial value */0, /* array size */CSTALL_num, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */commit_stall_str, /* scale_me */TRUE, /* print fn */NULL); stat_reg_note(sdb,"#### TIMING STATS ####"); sprintf(buf,"c%d.sim_cycle",arch->id); stat_reg_qword(sdb, true, buf, "total number of cycles when last instruction (or uop) committed", (qword_t*) &core->stat.final_sim_cycle, 0, TRUE, NULL); /* cumulative slip cycles (not printed) */ sprintf(buf,"c%d.Mop_fetch_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total Mop fetch slip cycles", (qword_t*) &core->stat.Mop_fetch_slip, 0, TRUE, NULL); sprintf(buf,"c%d.Mop_f2d_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total Mop fetch-to-decode slip cycles", (qword_t*) &core->stat.Mop_fetch2decode_slip, 0, TRUE, NULL); sprintf(buf,"c%d.Mop_decode_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total Mop decode slip cycles", (qword_t*) &core->stat.Mop_decode_slip, 0, TRUE, NULL); sprintf(buf,"c%d.uop_d2a_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total uop decode-to-alloc slip cycles", (qword_t*) &core->stat.uop_decode2alloc_slip, 0, TRUE, NULL); sprintf(buf,"c%d.uop_a2r_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total uop alloc-to-ready slip cycles", (qword_t*) &core->stat.uop_alloc2ready_slip, 0, TRUE, NULL); sprintf(buf,"c%d.uop_r2i_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total uop ready-to-issue slip cycles", (qword_t*) &core->stat.uop_ready2issue_slip, 0, TRUE, NULL); sprintf(buf,"c%d.uop_i2e_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total uop issue-to-exec slip cycles", (qword_t*) &core->stat.uop_issue2exec_slip, 0, TRUE, NULL); sprintf(buf,"c%d.uop_e2w_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total uop exec-to-WB slip cycles", (qword_t*) &core->stat.uop_exec2complete_slip, 0, TRUE, NULL); sprintf(buf,"c%d.uop_w2c_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total uop WB-to-commit slip cycles", (qword_t*) &core->stat.uop_complete2commit_slip, 0, TRUE, NULL); sprintf(buf,"c%d.Mop_d2c_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total Mop decode-to-commit slip cycles", (qword_t*) &core->stat.Mop_decode2commit_slip, 0, TRUE, NULL); sprintf(buf,"c%d.Mop_commit_Tslip",core->current_thread->id); stat_reg_qword(sdb, false, buf, "total Mop commit slip cycles", (qword_t*) &core->stat.Mop_commit_slip, 0, TRUE, NULL); /* average slip cycles */ sprintf(buf,"c%d.Mop_fetch_avg_slip",arch->id); sprintf(buf2,"c%d.Mop_fetch_Tslip / (c%d.commit_insn - c%d.num_traps)",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "Mop fetch average delay", buf2, NULL); sprintf(buf,"c%d.Mop_f2d_avg_slip",arch->id); sprintf(buf2,"c%d.Mop_f2d_Tslip / (c%d.commit_insn - c%d.num_traps)",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "Mop fetch-to-decode average delay", buf2, NULL); sprintf(buf,"c%d.Mop_decode_avg_slip",arch->id); sprintf(buf2,"c%d.Mop_decode_Tslip / (c%d.commit_insn - c%d.num_traps)",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "Mop decode average delay", buf2, NULL); sprintf(buf,"c%d.uop_d2a_avg_slip",arch->id); sprintf(buf2,"c%d.uop_d2a_Tslip / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uop decode-to-alloc average delay", buf2, NULL); sprintf(buf,"c%d.uop_a2r_avg_slip",arch->id); sprintf(buf2,"c%d.uop_a2r_Tslip / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uop alloc-to-ready average delay", buf2, NULL); sprintf(buf,"c%d.uop_r2i_avg_slip",arch->id); sprintf(buf2,"c%d.uop_r2i_Tslip / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uop ready-to-issue average delay", buf2, NULL); sprintf(buf,"c%d.uop_i2e_avg_slip",arch->id); sprintf(buf2,"c%d.uop_i2e_Tslip / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uop issue-to-exec average delay", buf2, NULL); sprintf(buf,"c%d.uop_e2w_avg_slip",arch->id); sprintf(buf2,"c%d.uop_e2w_Tslip / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uop exec-to-WB average delay", buf2, NULL); sprintf(buf,"c%d.uop_w2c_avg_slip",arch->id); sprintf(buf2,"c%d.uop_w2c_Tslip / c%d.commit_uops",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "uop WB-to-commit average delay", buf2, NULL); sprintf(buf,"c%d.Mop_d2c_avg_slip",arch->id); sprintf(buf2,"c%d.Mop_d2c_Tslip / (c%d.commit_insn - c%d.num_traps)",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "Mop decode-to-commit average delay", buf2, NULL); sprintf(buf,"c%d.Mop_commit_avg_slip",arch->id); sprintf(buf2,"c%d.Mop_commit_Tslip / (c%d.commit_insn - c%d.num_traps)",arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "Mop commit average delay", buf2, NULL); sprintf(buf,"c%d.Mop_avg_end_to_end",arch->id); sprintf(buf2,"c%d.Mop_fetch_avg_slip + c%d.Mop_f2d_avg_slip + c%d.Mop_d2c_avg_slip + c%d.Mop_commit_avg_slip",arch->id,arch->id,arch->id,arch->id); stat_reg_formula(sdb, true, buf, "Mop average end-to-end pipeline delay", buf2, NULL); /* instruction distribution stats */ stat_reg_note(sdb,"\n#### INSTRUCTION STATS (no wrong-path) ####"); sprintf(buf,"c%d.num_insn",arch->id); sprintf(buf2,"c%d.commit_insn",arch->id); stat_reg_formula(sdb, true, buf, "total number of instructions committed", buf2, NULL); sprintf(buf,"c%d.num_refs",arch->id); stat_reg_counter(sdb, true, buf, "total number of loads and stores committed", &core->stat.commit_refs, 0, TRUE, NULL); sprintf(buf,"c%d.num_loads",arch->id); stat_reg_counter(sdb, true, buf, "total number of loads committed", &core->stat.commit_loads, 0, TRUE, NULL); sprintf(buf2,"c%d.num_refs - c%d.num_loads",arch->id,arch->id); sprintf(buf,"c%d.num_stores",arch->id); stat_reg_formula(sdb, true, buf, "total number of stores committed", buf2, "%12.0f"); sprintf(buf,"c%d.num_branches",arch->id); stat_reg_counter(sdb, true, buf, "total number of branches committed", &core->stat.commit_branches, 0, TRUE, NULL); sprintf(buf,"c%d.num_traps",arch->id); stat_reg_counter(sdb, true, buf, "total number of traps committed", &core->stat.commit_traps, 0, TRUE, NULL); sprintf(buf,"c%d.num_rep_insn",arch->id); stat_reg_counter(sdb, true, buf, "total number of REP insts committed", &core->stat.commit_rep_insn, 0, TRUE, NULL); sprintf(buf,"c%d.num_rep_iter",arch->id); stat_reg_counter(sdb, true, buf, "total number of REP iterations committed", &core->stat.commit_rep_iterations, 0, TRUE, NULL); sprintf(buf,"c%d.num_rep_uops",arch->id); stat_reg_counter(sdb, true, buf, "total number of uops in REP insts committed", &core->stat.commit_rep_uops, 0, TRUE, NULL); sprintf(buf,"c%d.num_avg_reps",arch->id); sprintf(buf2,"c%d.num_rep_iter/c%d.num_rep_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average iterations per REP inst", buf2, "%12.2f"); sprintf(buf,"c%d.num_avg_rep_uops",arch->id); sprintf(buf2,"c%d.num_rep_uops/c%d.num_rep_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average uops per REP inst", buf2, "%12.2f"); sprintf(buf,"c%d.num_UROM_insn",arch->id); stat_reg_counter(sdb, true, buf, "total number of insn using the UROM committed", &core->stat.commit_UROM_insn, 0, TRUE, NULL); sprintf(buf,"c%d.num_UROM_uops",arch->id); stat_reg_counter(sdb, true, buf, "total number of uops using the UROM committed", &core->stat.commit_UROM_uops, 0, TRUE, NULL); sprintf(buf,"c%d.num_UROM_eff_uops",arch->id); stat_reg_counter(sdb, true, buf, "total number of effective uops using the UROM committed", &core->stat.commit_UROM_eff_uops, 0, TRUE, NULL); sprintf(buf,"c%d.num_avg_UROM_uops",arch->id); sprintf(buf2,"c%d.num_UROM_uops/c%d.num_UROM_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average uops per UROM inst", buf2, "%12.2f"); sprintf(buf,"c%d.avg_flowlen",arch->id); sprintf(buf2,"c%d.commit_uops/c%d.commit_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average uops per instruction", buf2, NULL); sprintf(buf,"c%d.avg_eff_flowlen",arch->id); sprintf(buf2,"c%d.commit_eff_uops/c%d.commit_insn",arch->id,arch->id); stat_reg_formula(sdb, true, buf, "average effective uops per instruction", buf2, NULL); sprintf(buf,"c%d.regfile_writes",arch->id); stat_reg_counter(sdb, true, buf, "number of register file writes", &core->stat.regfile_writes, 0, TRUE, NULL); sprintf(buf,"c%d.fp_regfile_writes",arch->id); stat_reg_counter(sdb, true, buf, "number of fp refister file writes", &core->stat.fp_regfile_writes, 0, TRUE, NULL); sprintf(buf,"c%d.flow_lengths",core->current_thread->id); core->stat.flow_histo = stat_reg_dist(sdb, buf, "histogram of uop flow lengths", /* initial value */0, /* array size */FLOW_HISTO_SIZE, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */NULL, /* scale_me */TRUE, /* print fn */NULL); sprintf(buf,"c%d.eff_flow_lengths",core->current_thread->id); core->stat.eff_flow_histo = stat_reg_dist(sdb, buf, "histogram of effective uop flow lengths", /* initial value */0, /* array size */FLOW_HISTO_SIZE, /* bucket size */1, /* print format */(PF_COUNT|PF_PDF), /* format */NULL, /* index map */NULL, /* scale_me */TRUE, /* print fn */NULL); }
void main(void) { struct stat_sdb_t *sdb; struct stat_stat_t *stat, *stat1, *stat2, *stat3, *stat4, *stat5; int an_int; unsigned int a_uint; float a_float; double a_double; static char *my_imap[8] = { "foo", "bar", "uxxe", "blah", "gaga", "dada", "mama", "googoo" }; /* make stats database */ sdb = stat_new(); /* register stat variables */ stat_reg_int(sdb, "stat.an_int", "An integer stat variable.", &an_int, 1, NULL); stat_reg_uint(sdb, "stat.a_uint", "An unsigned integer stat variable.", &a_uint, 2, "%u (unsigned)"); stat_reg_float(sdb, "stat.a_float", "A float stat variable.", &a_float, 3, NULL); stat_reg_double(sdb, "stat.a_double", "A double stat variable.", &a_double, 4, NULL); stat_reg_formula(sdb, "stat.a_formula", "A double stat formula.", "stat.a_float / stat.a_uint", NULL); stat_reg_formula(sdb, "stat.a_formula1", "A double stat formula #1.", "2 * (stat.a_formula / (1.5 * stat.an_int))", NULL); stat_reg_formula(sdb, "stat.a_bad_formula", "A double stat formula w/error.", "stat.a_float / (stat.a_uint - 2)", NULL); stat = stat_reg_dist(sdb, "stat.a_dist", "An array distribution.", 0, 8, 1, PF_ALL, NULL, NULL, NULL); stat1 = stat_reg_dist(sdb, "stat.a_dist1", "An array distribution #1.", 0, 8, 4, PF_ALL, NULL, NULL, NULL); stat2 = stat_reg_dist(sdb, "stat.a_dist2", "An array distribution #2.", 0, 8, 1, (PF_PDF|PF_CDF), NULL, NULL, NULL); stat3 = stat_reg_dist(sdb, "stat.a_dist3", "An array distribution #3.", 0, 8, 1, PF_ALL, NULL, my_imap, NULL); stat4 = stat_reg_sdist(sdb, "stat.a_sdist", "A sparse array distribution.", 0, PF_ALL, NULL, NULL); stat5 = stat_reg_sdist(sdb, "stat.a_sdist1", "A sparse array distribution #1.", 0, PF_ALL, "0x%08lx %10lu %6.2f %6.2f", NULL); /* print initial stats */ fprintf(stdout, "** Initial stats...\n"); stat_print_stats(sdb, stdout); /* adjust stats */ an_int++; a_uint++; a_float *= 2; a_double *= 4; stat_add_sample(stat, 8); stat_add_sample(stat, 8); stat_add_sample(stat, 1); stat_add_sample(stat, 3); stat_add_sample(stat, 4); stat_add_sample(stat, 4); stat_add_sample(stat, 7); stat_add_sample(stat1, 32); stat_add_sample(stat1, 32); stat_add_sample(stat1, 1); stat_add_sample(stat1, 12); stat_add_sample(stat1, 17); stat_add_sample(stat1, 18); stat_add_sample(stat1, 30); stat_add_sample(stat2, 8); stat_add_sample(stat2, 8); stat_add_sample(stat2, 1); stat_add_sample(stat2, 3); stat_add_sample(stat2, 4); stat_add_sample(stat2, 4); stat_add_sample(stat2, 7); stat_add_sample(stat3, 8); stat_add_sample(stat3, 8); stat_add_sample(stat3, 1); stat_add_sample(stat3, 3); stat_add_sample(stat3, 4); stat_add_sample(stat3, 4); stat_add_sample(stat3, 7); stat_add_sample(stat4, 800); stat_add_sample(stat4, 800); stat_add_sample(stat4, 1123); stat_add_sample(stat4, 3332); stat_add_sample(stat4, 4000); stat_add_samples(stat4, 4001, 18); stat_add_sample(stat4, 7); stat_add_sample(stat5, 800); stat_add_sample(stat5, 800); stat_add_sample(stat5, 1123); stat_add_sample(stat5, 3332); stat_add_sample(stat5, 4000); stat_add_samples(stat5, 4001, 18); stat_add_sample(stat5, 7); /* print final stats */ fprintf(stdout, "** Final stats...\n"); stat_print_stats(sdb, stdout); /* all done */ stat_delete(sdb); exit(0); }