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) /* stats database */ { int i; /* register baseline stats */ 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); /* register cache stats */ if (cache_il1 && (cache_il1 != cache_dl1 && cache_il1 != cache_dl2)) cache_reg_stats(cache_il1, sdb); if (cache_il2 && (cache_il2 != cache_dl1 && cache_il2 != cache_dl2)) cache_reg_stats(cache_il2, sdb); if (cache_dl1) cache_reg_stats(cache_dl1, sdb); if (cache_dl2) cache_reg_stats(cache_dl2, sdb); if (itlb) cache_reg_stats(itlb, sdb); if (dtlb) cache_reg_stats(dtlb, sdb); 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 fmt */(PF_COUNT|PF_PDF), /* format */"0x%p %u %.2f", /* print fn */NULL); } ld_reg_stats(sdb); mem_reg_stats(mem, sdb); }