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 |