static void
print_results(double cpu_mhz,
              unsigned long * timestamps,
              size_t iteration_count,
              unsigned long test_duration_cycles,
              uint64_t limit_ns)
{
    double ns_per_cycle = 1000. / cpu_mhz;

    size_t min_index = gsl_stats_ulong_min_index(timestamps, 1,
                                                 iteration_count);
    size_t max_index = gsl_stats_ulong_max_index(timestamps, 1,
                                                 iteration_count);
    double mean = gsl_stats_ulong_mean(timestamps, 1, iteration_count);
    double sd = gsl_stats_ulong_sd(timestamps, 1, iteration_count);

    fprintf(stdout, "Samples count: %'zu\n"
                    "Sampling duration: %'.0lf ms\n"
                    "Detected frequency: %.0lf Mhz\n"
                    "\n"
                    "Min: %'.0lf ns @%zu\n"
                    "Mean: %'.0lf ns\n"
                    "Max: %'.0lf ns @%zu\n"
                    "\n"
                    "Std: %'.0lf ns\n",
            iteration_count,
            test_duration_cycles * ns_per_cycle / (1000. * 1000.),
            cpu_mhz,
            ns_per_cycle * timestamps[min_index], min_index,
            ns_per_cycle * mean,
            ns_per_cycle * timestamps[max_index], max_index,
            ns_per_cycle * sd);

    if (limit_ns)
        print_results_above(limit_ns,
                            ns_per_cycle,
                            timestamps,
                            iteration_count,
                            timestamps[max_index]);

}
Ejemplo n.º 2
0
uint64_t calc_rdtsc_overhead() {
  uint32_t TRIALS = 1000000;
  uint64_t* times = (uint64_t*) calloc(TRIALS,sizeof(uint64_t));
 
  uint64_t start=0, end=0;
  for(uint32_t i = 0; i < TRIALS; i++){
    start = rdtsc64();
    end = rdtsc64();
    times[i] = (end -start)>0?(end - start):0;
  }
  gsl_sort_ulong((unsigned long*)times,1,TRIALS);
  uint64_t median = gsl_stats_ulong_median_from_sorted_data ((unsigned long*)times,1,TRIALS);
#ifdef DEBUG
  double mean = gsl_stats_ulong_mean(times, 1, TRIALS);
  double sd = gsl_stats_ulong_sd(times, 1, TRIALS);
  uint64_t max = times[TRIALS-1];
  uint64_t min = times[0];
#endif
  free(times);
#ifdef DEBUG
  printf("| Median: %lu | Mean: %6.3f | Std Deviation: %6.3f | Min: %lu | Max: %lu |\n",median,mean,sd,min,max);
#endif
  return median; 
}