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]); }
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; }