mems_disksim.c
来自「disksim是一个非常优秀的磁盘仿真工具」· C语言 代码 · 共 1,418 行 · 第 1/3 页
C
1,418 行
&dev->sled[j].stat.stream_turnaround_number); stat_initialize (statdeffile, statdesc_subtrack_accesses, &dev->sled[j].stat.subtrack_accesses); stat_initialize (statdeffile, statdesc_tips_per_access, &dev->sled[j].stat.tips_per_access); stat_initialize (statdeffile, statdesc_inactive_time, &dev->sled[j].stat.inactive_time); stat_initialize (statdeffile, statdesc_prefetched_blocks, &dev->sled[j].stat.prefetched_blocks); } else { stat_reset (&dev->sled[j].stat.request_energy_uj); stat_reset (&dev->sled[j].stat.seek_time); stat_reset (&dev->sled[j].stat.x_seek_time); stat_reset (&dev->sled[j].stat.y_seek_time); stat_reset (&dev->sled[j].stat.turnaround_time); stat_reset (&dev->sled[j].stat.turnaround_number); stat_reset (&dev->sled[j].stat.stream_turnaround_time); stat_reset (&dev->sled[j].stat.stream_turnaround_number); stat_reset (&dev->sled[j].stat.subtrack_accesses); stat_reset (&dev->sled[j].stat.tips_per_access); stat_reset (&dev->sled[j].stat.inactive_time); stat_reset (&dev->sled[j].stat.prefetched_blocks); } dev->sled[j].stat.total_energy_j = 0.0; dev->sled[j].stat.servicing_energy_j = 0.0; dev->sled[j].stat.startup_energy_j = 0.0; dev->sled[j].stat.idle_energy_j = 0.0; dev->sled[j].stat.inactive_energy_j = 0.0; dev->sled[j].stat.num_spinups = 0; dev->sled[j].stat.num_spindowns = 0; dev->sled[j].stat.num_buffer_accesses = 0; dev->sled[j].stat.num_buffer_hits = 0; dev->sled[j].stat.num_initial_turnarounds = 0; dev->sled[j].stat.num_stream_turnarounds = 0; }}/* Reset device and ioqueue statistics */void mems_cleanstats (void){ mems_t *dev; int i; /* loop counter [which device] */ int j; /* loop counter [which sled on device] */ if (disksim->memsinfo == NULL) { return; } /* FIXME: Should this be (i=0; i<disksim->memsinfo->nummdevices) ? */ for (i = 0; i < disksim->memsinfo->devices_len; i++) { dev = getmems(i); if (dev) { ioqueue_cleanstats(dev->queue); /* FIXME: Should this be (j=0; j<dev->numsleds; j++) ? */ for (j = 0; j < dev->num_sleds; j++) { ioqueue_cleanstats(dev->sled[j].queue); /* FIXME: Should we also clean mems stat structures? */ } } } return;}/* Uh, reset the statistics. */voidmems_resetstats (void){ mems_t *dev; int i; int j; if (disksim->memsinfo == NULL) { return; } for (i = 0; i < disksim->memsinfo->devices_len; i++) { dev = getmems(i); if (dev) { ioqueue_resetstats(dev->queue); for (j=0; j<MEMS_MAXSLEDS; j++) { ioqueue_resetstats(dev->sled[j].queue); } mems_statinit(i, FALSE); } }}static voidmems_prefetch_printstats (int *set, int setsize, char *prefix){ int i; int j; statgen *statset[MAXDEVICES]; mems_t *dev = 0; /************************************************************************ * prefetched_blocks ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.prefetched_blocks; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.prefetched_blocks; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.prefetched_blocks; stat_print_set(statset, 1, newprefix); } }}static voidmems_seektime_printstats (int *set, int setsize, char *prefix){ int i; int j; statgen *statset[MAXDEVICES]; mems_t *dev = 0; /************************************************************************ * seek_time ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.seek_time; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.seek_time; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.seek_time; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * x_seek_time ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.x_seek_time; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.x_seek_time; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.x_seek_time; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * y_seek_time ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.y_seek_time; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.y_seek_time; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.y_seek_time; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * turnaround_time ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.turnaround_time; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.turnaround_time; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.turnaround_time; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * turnaround_number ************************************************************************/ /* Overall statistics */ fprintf(outputfile, "%sTotal initial turnarounds: %d\n", prefix, dev->stat.num_initial_turnarounds); for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.turnaround_number; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); fprintf(outputfile, "%sTotal initial turnarounds: %d\n", newprefix, dev->stat.num_initial_turnarounds); statset[0] = &dev->stat.turnaround_number; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.turnaround_number; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * stream_turnaround_time ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.stream_turnaround_time; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.stream_turnaround_time; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.stream_turnaround_time; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * stream_turnaround_number ************************************************************************/ /* Overall statistics */ fprintf(outputfile, "%sTotal streaming turnarounds: %d\n", prefix, dev->stat.num_stream_turnarounds); for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.stream_turnaround_number; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); fprintf(outputfile, "%sTotal streaming turnarounds: %d\n", newprefix, dev->stat.num_stream_turnarounds); statset[0] = &dev->stat.stream_turnaround_number; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.stream_turnaround_number; stat_print_set(statset, 1, newprefix); } }}static voidmems_energy_printstats (int *set, int setsize, char *prefix){ int i; int j; statgen *statset[MAXDEVICES]; mems_t *dev; /************************************************************************ * Per-request energy (request_energy_uj) ************************************************************************/ /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); statset[i] = &dev->stat.request_energy_uj; } stat_print_set(statset, setsize, prefix); /* Per-device and per-sled statistics */ for (i=0; i < setsize; i++) { char newprefix[80]; dev = getmems(set[i]); sprintf(newprefix, "%sdevice %d ", prefix, i); statset[0] = &dev->stat.request_energy_uj; stat_print_set(statset, 1, newprefix); for (j=0; j < dev->num_sleds; j++) { sprintf(newprefix, "%sdevice %d sled %d ", prefix, i, j); statset[0] = &dev->sled[j].stat.request_energy_uj; stat_print_set(statset, 1, newprefix); } } /************************************************************************ * Total energy dissipated ************************************************************************/ { double total_energy = 0.0; double servicing_energy = 0.0; double startup_energy = 0.0; double idle_energy = 0.0; double inactive_energy = 0.0; for (i=0; i < setsize; i++) { dev = getmems(set[i]); total_energy += dev->stat.total_energy_j; servicing_energy += dev->stat.servicing_energy_j; startup_energy += dev->stat.startup_energy_j; idle_energy += dev->stat.idle_energy_j; inactive_energy += dev->stat.inactive_energy_j; } fprintf(outputfile, "%sTotal energy (J): %f\n", prefix, total_energy); fprintf(outputfile, "%sServicing energy (J): %f\n", prefix, servicing_energy); fprintf(outputfile, "%sStartup energy (J): %f\n", prefix, startup_energy); fprintf(outputfile, "%sIdle energy (J): %f\n", prefix, idle_energy); fprintf(outputfile, "%sInactive energy (J): %f\n", prefix, inactive_energy); fprintf(outputfile, "\n"); } /* Finally, total energy dissipated by each device and sled */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); fprintf(outputfile, "%sTotal energy (J) for device %d: %f\n", prefix, set[i], dev->stat.total_energy_j); fprintf(outputfile, "%sServicing energy (J) for device %d: %f\n", prefix, set[i], dev->stat.servicing_energy_j); fprintf(outputfile, "%sStartup energy (J) for device %d: %f\n", prefix, set[i], dev->stat.startup_energy_j); fprintf(outputfile, "%sIdle energy (J) for device %d: %f\n", prefix, set[i], dev->stat.idle_energy_j); fprintf(outputfile, "%sInactive energy (J) for device %d: %f\n", prefix, set[i], dev->stat.inactive_energy_j); for (j=0; j < dev->num_sleds; j++) { fprintf(outputfile, "%sTotal energy (J) for device %d sled %d: %f\n", prefix, set[i], j, dev->sled[j].stat.total_energy_j); fprintf(outputfile, "%sServicing energy (J) for device %d sled %d: %f\n", prefix, set[i], j, dev->sled[j].stat.servicing_energy_j); fprintf(outputfile, "%sStartup energy (J) for device %d sled %d: %f\n", prefix, set[i], j, dev->sled[j].stat.startup_energy_j); fprintf(outputfile, "%sIdle energy (J) for device %d sled %d: %f\n", prefix, set[i], j, dev->sled[j].stat.idle_energy_j); fprintf(outputfile, "%sInactive energy (J) for device %d sled %d: %f\n", prefix, set[i], j, dev->sled[j].stat.inactive_energy_j); } fprintf(outputfile, "\n"); }}static voidmems_buffer_printstats (int *set, int setsize, char *prefix){ int i; mems_t *dev; int total_accesses = 0; int total_hits = 0; double hit_ratio; /* Overall statistics */ for (i=0; i < setsize; i++) { dev = getmems(set[i]); total_accesses += dev->stat.num_buffer_accesses; total_hits += dev->stat.num_buffer_hits; } hit_ratio = (double)total_hits / (double)total_accesses; fprintf(outputfile, "%sNumber of buffer accesses: %d\n", prefix, total_accesses); fprintf(outputfile, "%sNumber of hits: %d\n", prefix, total_hits); fprintf(outputfile, "%sBuffer hit ratio: %f\n", prefix, hit_ratio); fprintf(outputfile, "%sBuffer miss ratio: %f\n", prefix, 1.0 - hit_ratio); fprintf(outputfile, "\n");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?