| OLD | NEW |
| 1 #include <assert.h> | 1 #include <assert.h> |
| 2 #include <math.h> | 2 #include <math.h> |
| 3 #include <stdio.h> | 3 #include <stdio.h> |
| 4 #include <stdlib.h> | 4 #include <stdlib.h> |
| 5 #include <string.h> | 5 #include <string.h> |
| 6 #include <sys/time.h> | 6 #include <sys/time.h> |
| 7 #include "bench-framework.h" | 7 #include "bench-framework.h" |
| 8 #include "benchstringio.h" | 8 #include "benchstringio.h" |
| 9 | 9 |
| 10 /* Minimum benchmark runtime in us */ | 10 /* Minimum benchmark runtime in us */ |
| 11 static const int kMinBenchRuntime = 1000000; | 11 static const int kMinBenchRuntime = 1000000; |
| 12 static int benchmark_count = 0; | 12 static int benchmark_count = 0; |
| 13 static int started = 0; | 13 static int started = 0; |
| 14 static bench_info bench_info_list[MAX_BENCHMARKS]; | 14 static bench_info bench_info_list[MAX_BENCHMARKS]; |
| 15 static run_data bench_run_data[MAX_BENCHMARKS]; | 15 static run_data bench_run_data[MAX_BENCHMARKS]; |
| 16 | 16 |
| 17 enum run_model_t { kRunModelRepeated, kRunModelOnce }; | 17 enum run_model_t { kRunModelRepeated, kRunModelOnce }; |
| 18 static enum run_model_t run_model; | 18 static enum run_model_t run_model; |
| 19 | 19 |
| 20 void RegisterBenchmark(char *name, bench_function entry, int param, int time_ref
) { | 20 void RegisterBenchmark(char *name, bench_function entry, int param, int time_ref
) { |
| 21 if (benchmark_count == MAX_BENCHMARKS) { |
| 22 ReportStatus("Too many benchmarks. Increase MAX_BENCHMARKS in framework\n"); |
| 23 exit(1); |
| 24 } |
| 21 bench_info_list[benchmark_count].name = name; | 25 bench_info_list[benchmark_count].name = name; |
| 22 bench_info_list[benchmark_count].run = entry; | 26 bench_info_list[benchmark_count].run = entry; |
| 23 bench_info_list[benchmark_count].time_ref = time_ref; | 27 bench_info_list[benchmark_count].time_ref = time_ref; |
| 24 bench_info_list[benchmark_count].param = param; | 28 bench_info_list[benchmark_count].param = param; |
| 25 benchmark_count++; | 29 benchmark_count++; |
| 26 } | 30 } |
| 27 | 31 |
| 28 void ClearBenchmarks() { | 32 void ClearBenchmarks() { |
| 29 for (int i = 0; i < benchmark_count; i++) free(bench_info_list[i].name); | 33 for (int i = 0; i < benchmark_count; i++) free(bench_info_list[i].name); |
| 30 benchmark_count = 0; | 34 benchmark_count = 0; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 for (i = 0; i < benchmark_count; i++) { | 68 for (i = 0; i < benchmark_count; i++) { |
| 65 run_data *rd = &bench_run_data[i]; | 69 run_data *rd = &bench_run_data[i]; |
| 66 bench_info *bi = &bench_info_list[i]; | 70 bench_info *bi = &bench_info_list[i]; |
| 67 double usec_per_run; | 71 double usec_per_run; |
| 68 printf("Running %s\n", bi->name); | 72 printf("Running %s\n", bi->name); |
| 69 ++started; | 73 ++started; |
| 70 ReportStatus("Running %s (%d/%d)\n", bi->name, started, benchmark_count); | 74 ReportStatus("Running %s (%d/%d)\n", bi->name, started, benchmark_count); |
| 71 RunOne(bi, rd); | 75 RunOne(bi, rd); |
| 72 usec_per_run = (double)rd->elapsed / (double)rd->runs; | 76 usec_per_run = (double)rd->elapsed / (double)rd->runs; |
| 73 rd->score = 100.0 * bi->time_ref / usec_per_run; | 77 rd->score = 100.0 * bi->time_ref / usec_per_run; |
| 78 printf("usec_per_run %f\n", usec_per_run); |
| 74 ReportStatus("%s: %d", bi->name, (int)rd->score); | 79 ReportStatus("%s: %d", bi->name, (int)rd->score); |
| 75 } | 80 } |
| 76 started = 0; | 81 started = 0; |
| 77 } | 82 } |
| 78 | 83 |
| 79 static void PrintScores() { | 84 static void PrintScores() { |
| 80 int i; | 85 int i; |
| 81 for (i = 0; i < benchmark_count; i++) { | 86 for (i = 0; i < benchmark_count; i++) { |
| 82 printf("Benchmark %s: usec %d, iters %d, usec/run %d score %.2f\n", | 87 printf("Benchmark %s: usec %d, iters %d, usec/run %d score %.2f\n", |
| 83 bench_info_list[i].name, | 88 bench_info_list[i].name, |
| 84 bench_run_data[i].elapsed, | 89 bench_run_data[i].elapsed, |
| 85 bench_run_data[i].runs, | 90 bench_run_data[i].runs, |
| 86 bench_run_data[i].elapsed / bench_run_data[i].runs, | 91 bench_run_data[i].elapsed / bench_run_data[i].runs, |
| 87 bench_run_data[i].score); | 92 bench_run_data[i].score); |
| 88 } | 93 } |
| 89 } | 94 } |
| 90 | 95 |
| 91 static double GeometricMean() { | 96 static double GeometricMean() { |
| 92 int i; | 97 int i; |
| 93 double log_total = 0.0; | 98 double log_total = 0.0; |
| 94 for (i = 0; i < benchmark_count; i++) { | 99 for (i = 0; i < benchmark_count; i++) { |
| 95 log_total += log(bench_run_data[i].score); | 100 log_total += log(bench_run_data[i].score); |
| 96 } | 101 } |
| 97 return pow(M_E, log_total / benchmark_count); | 102 return pow(M_E, log_total / benchmark_count); |
| 98 } | 103 } |
| 99 | 104 |
| 100 void SetupSmallBenchmarks() { | 105 void SetupSmallBenchmarks() { |
| 106 RegisterBenchmark(strdup("Richards"), run_richards, 10000, 35302); |
| 107 RegisterBenchmark(strdup("Deltablue"), run_deltablue, 100, 66118); |
| 101 RegisterBenchmark(strdup("Fannkuchredux"), run_fannkuch, 10, 64052288); | 108 RegisterBenchmark(strdup("Fannkuchredux"), run_fannkuch, 10, 64052288); |
| 102 RegisterBenchmark(strdup("Nbody"), run_nbody, 1000000, 73000000); | 109 RegisterBenchmark(strdup("Nbody"), run_nbody, 1000000, 73000000); |
| 103 RegisterBenchmark(strdup("Spectralnorm"), run_spectralnorm, 350, 150020779); | 110 RegisterBenchmark(strdup("Spectralnorm"), run_spectralnorm, 350, 150020779); |
| 104 RegisterBenchmark(strdup("Fasta"), run_fasta, 10000, 51667385); | 111 RegisterBenchmark(strdup("Fasta"), run_fasta, 10000, 51667385); |
| 105 RegisterBenchmark(strdup("Revcomp"), run_revcomp, 0, 23542857); | 112 RegisterBenchmark(strdup("Revcomp"), run_revcomp, 0, 23542857); |
| 106 RegisterBenchmark(strdup("Binarytrees"), run_binarytrees, 15, 383306452); | 113 RegisterBenchmark(strdup("Binarytrees"), run_binarytrees, 15, 383306452); |
| 107 RegisterBenchmark(strdup("Knucleotide"), run_knucleotide, 0, 433893130); | 114 RegisterBenchmark(strdup("Knucleotide"), run_knucleotide, 0, 433893130); |
| 108 RegisterBenchmark(strdup("Pidigits"), run_pidigits, 1000, 406976744); | 115 RegisterBenchmark(strdup("Pidigits"), run_pidigits, 1000, 406976744); |
| 109 run_model = kRunModelRepeated; | 116 run_model = kRunModelRepeated; |
| 110 } | 117 } |
| 111 | 118 |
| 112 void SetupLargeBenchmarks() { | 119 void SetupLargeBenchmarks() { |
| 120 RegisterBenchmark(strdup("Richards"), run_richards, 1000000, 35302); |
| 121 RegisterBenchmark(strdup("Deltablue"), run_deltablue, 10000, 66118); |
| 113 RegisterBenchmark(strdup("Fannkuchredux"), run_fannkuch, 11, 64052288); | 122 RegisterBenchmark(strdup("Fannkuchredux"), run_fannkuch, 11, 64052288); |
| 114 RegisterBenchmark(strdup("Nbody"), run_nbody, 10000000, 73000000); | 123 RegisterBenchmark(strdup("Nbody"), run_nbody, 10000000, 73000000); |
| 115 RegisterBenchmark(strdup("Spectralnorm"), run_spectralnorm, 5500, 150020779); | 124 RegisterBenchmark(strdup("Spectralnorm"), run_spectralnorm, 5500, 150020779); |
| 116 RegisterBenchmark(strdup("Fasta"), run_fasta, 3000000, 51667385); | 125 RegisterBenchmark(strdup("Fasta"), run_fasta, 3000000, 51667385); |
| 117 RegisterBenchmark(strdup("Revcomp"), run_revcomp, 0, 23542857); | 126 RegisterBenchmark(strdup("Revcomp"), run_revcomp, 0, 23542857); |
| 118 RegisterBenchmark(strdup("Binarytrees"), run_binarytrees, 18, 383306452); | 127 RegisterBenchmark(strdup("Binarytrees"), run_binarytrees, 18, 383306452); |
| 119 RegisterBenchmark(strdup("Knucleotide"), run_knucleotide, 0, 433893130); | 128 RegisterBenchmark(strdup("Knucleotide"), run_knucleotide, 0, 433893130); |
| 120 RegisterBenchmark(strdup("Pidigits"), run_pidigits, 5000, 406976744); | 129 RegisterBenchmark(strdup("Pidigits"), run_pidigits, 5000, 406976744); |
| 121 run_model = kRunModelOnce; | 130 run_model = kRunModelOnce; |
| 122 } | 131 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 146 PrintScores(); | 155 PrintScores(); |
| 147 score = (int) GeometricMean(); | 156 score = (int) GeometricMean(); |
| 148 #ifdef ARRAYFILE | 157 #ifdef ARRAYFILE |
| 149 arrayfile_fclose(arrayfile_stdout); | 158 arrayfile_fclose(arrayfile_stdout); |
| 150 arrayfile_stdout = NULL; | 159 arrayfile_stdout = NULL; |
| 151 #endif | 160 #endif |
| 152 ClearBenchmarks(); | 161 ClearBenchmarks(); |
| 153 printf("Aggregate score: %d\n", score); | 162 printf("Aggregate score: %d\n", score); |
| 154 return score; | 163 return score; |
| 155 } | 164 } |
| OLD | NEW |