common_sim.h 4.63 KB
Newer Older
laurent's avatar
laurent committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

double median(varArray_t *input) {
  return *(double *)((uint8_t *)(input+1)+(input->size/2)*input->atomSize);
}

double q1(varArray_t *input) {
  return *(double *)((uint8_t *)(input+1)+(input->size/4)*input->atomSize);
}

double q3(varArray_t *input) {
  return *(double *)((uint8_t *)(input+1)+(3*input->size/4)*input->atomSize);
}

void dumpVarArray(varArray_t *input) {
  double *ptr=dataArray(input);
  printf("dumping size=%ld\n", input->size);

  for (int i=0; i < input->size; i++)
    printf("%.1f:", *ptr++);

  printf("\n");
}
void sumUpStats(time_stats_t * res, time_stats_t * src, int lastActive) {
24
  reset_meas(res);
laurent's avatar
laurent committed
25 26 27 28 29 30 31 32 33 34
	for (int i=0; i<RX_NB_TH; i++) {
	  res->diff+=src[i].diff;
	  res->diff_square+=src[i].diff_square;
	  res->trials+=src[i].trials;
	  if (src[i].max > res->max)
	    res->max=src[i].max;
	}
	res->p_time=src[lastActive].p_time;
}
void sumUpStatsSlot(time_stats_t *res, time_stats_t src[RX_NB_TH][2], int lastActive) {
35
  reset_meas(res);
laurent's avatar
laurent committed
36 37 38 39 40 41 42 43 44 45 46 47
	for (int i=0; i<RX_NB_TH; i++) {
	  res->diff+=src[i][0].diff+src[i][1].diff;
	  res->diff_square+=src[i][0].diff_square+src[i][1].diff_square;
	  res->trials+=src[i][0].trials+src[i][1].trials;
	  if (src[i][0].max > res->max)
	    res->max=src[i][0].max;
	  if (src[i][1].max > res->max)
	    res->max=src[i][1].max;}
	int last=src[lastActive][0].in < src[lastActive][1].in? 1 : 0 ;
	res->p_time=src[lastActive][last].p_time;
}

laurent's avatar
laurent committed
48 49 50 51 52 53 54 55 56
double squareRoot(time_stats_t *ptr) {
  double timeBase=1/(1000*cpu_freq_GHz);
  return sqrt((double)ptr->diff_square*pow(timeBase,2)/ptr->trials -
              pow((double)ptr->diff/ptr->trials*timeBase,2));
}

void printDistribution(time_stats_t *ptr, varArray_t *sortedList, char *txt) {
  double timeBase=1/(1000*cpu_freq_GHz);
  printf("%-43s %6.2f us (%d trials)\n",
laurent's avatar
laurent committed
57
         txt,
laurent's avatar
laurent committed
58
         (double)ptr->diff/ptr->trials*timeBase,
laurent's avatar
laurent committed
59
         ptr->trials);
laurent's avatar
laurent committed
60 61
  printf(" Statistics std=%.2f, median=%.2f, q1=%.2f, q3=%.2f µs (on %ld trials)\n",
         squareRoot(ptr), median(sortedList),q1(sortedList),q3(sortedList), sortedList->size);
laurent's avatar
laurent committed
62 63
}

laurent's avatar
laurent committed
64 65
void printStatIndent(time_stats_t *ptr, char *txt) {
  printf("|__ %-38s %6.2f us (%3d trials)\n",
laurent's avatar
laurent committed
66
         txt,
laurent's avatar
laurent committed
67
         ptr->trials?inMicroS(ptr->diff/ptr->trials):0,
laurent's avatar
laurent committed
68 69 70
         ptr->trials);
}

laurent's avatar
laurent committed
71
void printStatIndent2(time_stats_t *ptr, char *txt) {
laurent's avatar
laurent committed
72
  double timeBase=1/(1000*cpu_freq_GHz);
laurent's avatar
laurent committed
73 74 75 76
  printf("    |__ %-34s %6.2f us (%3d trials)\n",
         txt,
         ptr->trials?((double)ptr->diff)/ptr->trials*timeBase:0,
	 ptr->trials);
laurent's avatar
laurent committed
77 78
}

laurent's avatar
laurent committed
79
void printStatIndent3(time_stats_t *ptr, char *txt) {
laurent's avatar
laurent committed
80
  double timeBase=1/(1000*cpu_freq_GHz);
laurent's avatar
laurent committed
81
  printf("        |__ %-30s %6.2f us (%3d trials)\n",
laurent's avatar
laurent committed
82
         txt,
laurent's avatar
laurent committed
83 84
         ptr->trials?((double)ptr->diff)/ptr->trials*timeBase:0,
	 ptr->trials);
laurent's avatar
laurent committed
85 86
}

laurent's avatar
laurent committed
87

laurent's avatar
laurent committed
88 89 90 91 92
void logDistribution(FILE* fd, time_stats_t *ptr, varArray_t *sortedList, int dropped) {
  fprintf(fd,"%f;%f;%f;%f;%f;%f;%d;",
	  squareRoot(ptr),
	  (double)ptr->max, *(double*)dataArray(sortedList),
	  median(sortedList),q1(sortedList),q3(sortedList),
93
	  dropped);
laurent's avatar
laurent committed
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
}

struct option * parse_oai_options(paramdef_t *options) {
  int l;

  for(l=0; options[l].optname[0]!=0; l++) {};

  struct option *long_options=calloc(sizeof(struct option),l);

  for(int i=0; options[i].optname[0]!=0; i++) {
    long_options[i].name=options[i].optname;
    long_options[i].has_arg=options[i].paramflags==PARAMFLAG_BOOL?no_argument:required_argument;

    if ( options[i].voidptr)
      switch (options[i].type) {
      case TYPE_INT:
	*options[i].iptr=options[i].defintval;
	break;

      case TYPE_DOUBLE:
	*options[i].dblptr=options[i].defdblval;
	break;

      case TYPE_UINT8:
	*options[i].u8ptr=options[i].defintval;
	break;

      case TYPE_UINT16:
	*options[i].u16ptr=options[i].defintval;
	break;
124

laurent's avatar
laurent committed
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
      default:
	printf("not parsed type for default value %s\n", options[i].optname );
	exit(1);
      }

    continue;
  };
  return long_options;
}

void display_options_values(paramdef_t *options, int verbose) {
  for(paramdef_t * ptr=options; ptr->optname[0]!=0; ptr++) {
    char varText[256]="need specific display";

    if (ptr->voidptr != NULL) {
      if ( (ptr->paramflags & PARAMFLAG_BOOL) )
        strcpy(varText, *(bool *)ptr->iptr ? "True": "False" );
      else  switch (ptr->type) {
          case TYPE_INT:
            sprintf(varText,"%d",*ptr->iptr);
            break;

          case TYPE_DOUBLE:
            sprintf(varText,"%.2f",*ptr->dblptr);
            break;

	case TYPE_UINT8:
	  sprintf(varText,"%d",(int)*ptr->u8ptr);
	  break;
154

laurent's avatar
laurent committed
155 156 157
	case TYPE_UINT16:
	  sprintf(varText,"%d",(int)*ptr->u16ptr);
	  break;
158

laurent's avatar
laurent committed
159 160 161 162 163 164 165 166 167 168
	default:
	  printf("not decoded type\n");
	  exit(1);
        }
    }

    printf("--%-20s set to %s\n",ptr->optname, varText);
    if (verbose) printf("%s\n",ptr->helpstr);
  }
}