mems_disksim.c

来自「disksim是一个非常优秀的磁盘仿真工具」· C语言 代码 · 共 1,418 行 · 第 1/3 页

C
1,418
字号
  /* Per-device statistics */  for (i=0; i < setsize; i++) {    dev = getmems(set[i]);    if (dev->stat.num_buffer_accesses) {      hit_ratio = (double)dev->stat.num_buffer_hits / 	(double)dev->stat.num_buffer_accesses;    fprintf(outputfile, "%sNumber of buffer accesses for device %d: %d\n",	    prefix, i, dev->stat.num_buffer_accesses);    fprintf(outputfile, "%sNumber of buffer hits for device %d:     %d\n",	    prefix, i, dev->stat.num_buffer_hits);    fprintf(outputfile, "%sBuffer hit ratio for device %d:          %f\n",	    prefix, i, hit_ratio);    fprintf(outputfile, "%sBuffer miss ratio for device %d:         %f\n",	    prefix, i, 1.0 - hit_ratio);    fprintf(outputfile, "\n");    } else {      fprintf(outputfile, "%sNo buffer accesses for device %d\n",	      prefix, i);    }  }}static voidmems_inactive_printstats (int *set, int setsize, char *prefix){  int i;  int j;  statgen *statset[MAXDEVICES];  mems_t *dev;  /************************************************************************   * num_spinups   ************************************************************************/  {    int total_spinups = 0;    for (i=0; i < setsize; i++) {      dev = getmems(set[i]);      total_spinups += dev->stat.num_spinups;    }    fprintf(outputfile, "%sNumber of spinups: %d\n\n", 	    prefix, total_spinups);  }  /* Spinups for each device and sled */  for (i=0; i < setsize; i++) {    dev = getmems(set[i]);    fprintf(outputfile, "%sNumber of spinups for device %d: %d\n",	    prefix, set[i], dev->stat.num_spinups);    for (j=0; j < dev->num_sleds; j++) {      fprintf(outputfile, "%sNumber of spinups for device %d sled %d: %d\n",	      prefix, set[i], j, dev->sled[j].stat.num_spinups);    }    fprintf(outputfile, "\n");  }  /************************************************************************   * num_spindowns   ************************************************************************/  {    int total_spindowns = 0;    for (i=0; i < setsize; i++) {      dev = getmems(set[i]);      total_spindowns += dev->stat.num_spindowns;    }    fprintf(outputfile, "%sNumber of spindowns: %d\n\n", 	    prefix, total_spindowns);  }  /* Spindowns for each device and sled */  for (i=0; i < setsize; i++) {    dev = getmems(set[i]);    fprintf(outputfile, "%sNumber of spindowns for device %d: %d\n",	    prefix, set[i], dev->stat.num_spindowns);    for (j=0; j < dev->num_sleds; j++) {      fprintf(outputfile, "%sNumber of spindowns for device %d sled %d: %d\n",	      prefix, set[i], j, dev->sled[j].stat.num_spindowns);    }    fprintf(outputfile, "\n");  }  /************************************************************************   * inactive_time   ************************************************************************/    /* Overall statistics */  for (i=0; i < setsize; i++) {    dev = getmems(set[i]);    statset[i] = &dev->stat.inactive_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.inactive_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.inactive_time;      stat_print_set(statset, 1, newprefix);    }  }}static voidmems_other_printstats (int *set, int setsize, char *prefix){  int i;  int j;  statgen *statset[MAXDEVICES];  mems_t *dev;  /************************************************************************   * subtrack_accesses   ************************************************************************/    /* Overall statistics */  for (i=0; i < setsize; i++) {    dev = getmems(set[i]);    statset[i] = &dev->stat.subtrack_accesses;  }  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.subtrack_accesses;    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.subtrack_accesses;      stat_print_set(statset, 1, newprefix);    }  }  /************************************************************************   * tips_per_access   ************************************************************************/    /* Overall statistics */  for (i=0; i < setsize; i++) {    dev = getmems(set[i]);    statset[i] = &dev->stat.tips_per_access;  }  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.tips_per_access;    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.tips_per_access;      stat_print_set(statset, 1, newprefix);    }  }}/* Print set statistics */voidmems_printsetstats (int *set, int setsize, char *sourcestr){  int i;  struct ioq *queueset[MAXDEVICES];  int reqcnt = 0;  char prefix[80];  sprintf(prefix, "%smems ", sourcestr);  for (i=0; i<setsize; i++) {    mems_t *dev = getmems(set[i]);    queueset[i] = dev->queue;    reqcnt += ioqueue_get_number_of_requests(dev->queue);  }  if (reqcnt == 0) {    fprintf(outputfile, "\nNo mems requests for members of this set\n\n");    return;  }  ioqueue_printstats(queueset, setsize, prefix);  mems_prefetch_printstats(set, setsize, prefix);  mems_seektime_printstats(set, setsize, prefix);  mems_other_printstats(set, setsize, prefix);  mems_inactive_printstats(set, setsize, prefix);  mems_buffer_printstats(set, setsize, prefix);  mems_energy_printstats(set, setsize, prefix);}/* Print statistics */voidmems_printstats (void){  struct ioq *queueset[MAXDEVICES];  int set[MAXDEVICES];  int i;  int reqcnt = 0;  char prefix[80];  int devcnt;  mems_t *dev;  fprintf(outputfile, "\nMEMS STATISTICS\n----------------\n\n");  sprintf(prefix, "Mems ");  if (!disksim->memsinfo) {    fprintf(outputfile, "No mems requests encountered (1)\n");    return;  }      devcnt = 0;  for (i = 0; i < disksim->memsinfo->devices_len; i++) {    dev = getmems(i);    if (dev) {      // SCHLOS - this has been hard-coded to the first sled since      //  mems_event doesn't use the device queues anymore.      queueset[devcnt] = dev->sled[0].queue;      reqcnt += ioqueue_get_number_of_requests(dev->queue);      devcnt++;    }  }  assert(devcnt == disksim->memsinfo->numdevices);  /*  if (reqcnt == 0) {    fprintf(outputfile, "No mems requests encountered (2)\n");    return;  }  */  ioqueue_printstats(queueset, devcnt, prefix);  devcnt = 0;  for (i=0; i < disksim->memsinfo->devices_len; i++) {    dev = getmems(i);    if (dev) {      set[devcnt] = i;      devcnt++;    }  }  assert(devcnt == disksim->memsinfo->numdevices);  mems_prefetch_printstats(set, devcnt, prefix);  mems_seektime_printstats(set, devcnt, prefix);  mems_other_printstats(set, devcnt, prefix);  mems_inactive_printstats(set, devcnt, prefix);  mems_buffer_printstats(set, devcnt, prefix);  mems_energy_printstats(set, devcnt, prefix);  fprintf(outputfile, "\n\n");}/************************************************************************ * Initialization foo ************************************************************************/struct mems *memsmodel_mems_loadparams(struct lp_block *b,				       int *numptr){  int c;  int num;  struct mems *result;  mems_sled_t tmpsled;  device_initialize_deviceinfo();  bzero(&tmpsled, sizeof(tmpsled));  result = malloc(sizeof(mems_t));  if(!result) return 0;  bzero(result, sizeof(mems_t));  ((struct device_header *)result)->device_type = DEVICETYPE_MEMS;  /* Initialize disksim's memsinfo structures */  if (disksim->memsinfo == NULL) {    disksim->memsinfo = malloc(sizeof(struct mems_info));    ASSERT(disksim->memsinfo != NULL);    bzero((char *)disksim->memsinfo, sizeof(struct mems_info));/*      disksim->memsinfo->devices = malloc(MAXDEVICES * sizeof(mems_t)); *//*      ASSERT(disksim->memsinfo->devices != NULL); */  }  for(c = 0; c < disksim->memsinfo->devices_len; c++) {    if(!disksim->memsinfo->devices[c]) {      break;    }  }  if(c == disksim->memsinfo->devices_len) {    int newlen = disksim->memsinfo->devices_len ?      disksim->memsinfo->devices_len * 2 : 2;    int zerolen = newlen == 2 ? 2 : newlen / 2;         disksim->memsinfo->devices =       realloc(disksim->memsinfo->devices, 	      newlen * sizeof(mems_t *));    bzero(disksim->memsinfo->devices + c, zerolen * sizeof(mems_t *));    disksim->memsinfo->devices_len = newlen;  }    disksim->memsinfo->devices[c] = result;  num = c;  if(numptr) *numptr = num;  result->hdr = mems_hdr_initializer;  result->hdr.device_name = strdup(b->name);    disksim->memsinfo->numdevices++;      //#include "modules/disksim_mems_param.c"  lp_loadparams(result, b, &memsmodel_mems_mod);  for (c = 0; c < MAXINBUSES; c++) {    result->inbuses[c] = -1;    result->depth[c]   = -1;    result->slotno[c]  = -1;  }  for(c = 0; c < result->num_sleds; c++) {    memcpy(&result->sled[c], &result->sled[0], result->num_sleds * sizeof(mems_sled_t));    result->sled[c].queue = ioqueue_copy(result->queue);  }    device_add((struct device_header *)result, num);  return result;}mems_t *mems_copy(mems_t *src) {  mems_t *result = malloc(sizeof(mems_t));  bzero(result, sizeof(mems_t));  memcpy(result, src, sizeof(mems_t));  result->queue = ioqueue_copy(src->queue);  memcpy(&result->sled, src->sled, src->num_sleds * sizeof(mems_sled_t));  return result;}/* Initialize device structures */voidmems_initialize (void){  int i;  int j;  int k;  mems_t *dev;  if (disksim->memsinfo == NULL) return;  ioqueue_setcallbacks();  /* Initialize all devices that have been inited (huh?) */  for (i = 0; i < disksim->memsinfo->devices_len; i++) {    dev = getmems(i);    if (dev) {      dev->busowned = -1;      addlisttoextraq((event **)&dev->buswait);      ioqueue_initialize(dev->queue, i);      dev->dataxfer_req = NULL;      dev->dataxfer_queue = NULL;      /* Segment initialization stuff taken in part from disksim_disk.c */      if ((dev->numsegs > 0) && (dev->seglist == NULL)) {	dev->seglist = (struct mems_segment *)DISKSIM_malloc(sizeof(struct mems_segment));	dev->seglist->next = NULL;	dev->seglist->prev = NULL;	dev->seglist->time = 0.0;	dev->seglist->startblkno = 0;	dev->seglist->endblkno   = 0;	for (k = 1; k < dev->numsegs; k++) {	  struct mems_segment *tmpseg = (struct mems_segment *)DISKSIM_malloc(sizeof(struct mems_segment));	  tmpseg->next = dev->seglist;	  dev->seglist = tmpseg;	  tmpseg->next->prev = tmpseg;	  tmpseg->prev = NULL;	  tmpseg->startblkno = 0;	  tmpseg->endblkno   = 0;	}      }      if (dev->numsegs == 0) addlisttoextraq((event **)&dev->seglist);      mems_check_numblocks(dev);      for (j = 0; j < dev->num_sleds; j++) {	dev->sled[j].dev = dev;	ioqueue_initialize(dev->sled[j].queue, i);	dev->sled[j].active = MEMS_SLED_INACTIVE;	dev->sled[j].active_request = NULL;	dev->sled[j].prefetch_info  = NULL;	dev->sled[j].lastreq_lbn = mems_centermost_lbn(&dev->sled[j]);	dev->sled[j].lastreq_comptime = 0.0;	/* Initialize sled position, velocity at centermost LBN */	mems_lbn_to_position(dev->sled[j].lastreq_lbn, &dev->sled[j], &dev->sled[j].coordset_up, &dev->sled[j].coordset_dn, &dev->sled[j].tipset, NULL, NULL, NULL);	mems_coord_t_copy(&dev->sled[j].coordset_up.servo_start, &dev->sled[j].pos);      }      mems_statinit(i, TRUE);      if (dev->precompute_seek_count > 0) {	mems_precompute_seek_curve(dev);      }    }  }}void mems_unimplemented(void) {  fprintf(stderr, "*** error: mems method unsupported\n");  assert(0);}extern void mems_event_arrive (ioreq_event *curr);extern void mems_bus_delay_complete (int devno, ioreq_event *curr, int sentbusno);extern void mems_bus_ownership_grant (int devno, ioreq_event *curr, int busno, double arbdelay);/* default mems dev header */struct device_header mems_hdr_initializer = {   DEVICETYPE_MEMS,  sizeof(struct mems),  "unnamed mems",  (void *)mems_copy,  mems_set_depth,  mems_get_depth,  mems_get_inbus,  mems_get_busno,  mems_get_slotno,  mems_get_number_of_blocks,  mems_get_maxoutstanding,  mems_get_numcyls,  mems_get_blktranstime,  mems_get_avg_sectpercyl,  mems_get_mapping,  mems_event_arrive,  mems_get_distance,  mems_get_servtime,  mems_get_seektime,  (void *)mems_unimplemented,  mems_bus_delay_complete,  mems_bus_ownership_grant};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?