Changeset e7f9a09 in mainline for uspace/app/hbench/main.c
- Timestamp:
- 2019-01-21T13:20:31Z (5 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d17cf8c
- Parents:
- 94ebebf
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hbench/main.c
r94ebebf re7f9a09 53 53 #define MAX_ERROR_STR_LENGTH 1024 54 54 55 static void short_report(bench meter_t *meter, int run_index,55 static void short_report(bench_run_t *info, int run_index, 56 56 benchmark_t *bench, uint64_t workload_size) 57 57 { 58 csv_report_add_entry( meter, run_index, bench, workload_size);59 60 usec_t duration_usec = NSEC2USEC(stopwatch_get_nanos(& meter->stopwatch));58 csv_report_add_entry(info, run_index, bench, workload_size); 59 60 usec_t duration_usec = NSEC2USEC(stopwatch_get_nanos(&info->stopwatch)); 61 61 62 62 printf("Completed %" PRIu64 " operations in %llu us", 63 63 workload_size, duration_usec); 64 64 if (duration_usec > 0) { 65 double nanos = stopwatch_get_nanos(& meter->stopwatch);65 double nanos = stopwatch_get_nanos(&info->stopwatch); 66 66 double thruput = (double) workload_size / (nanos / 1000000000.0l); 67 67 printf(", %.0f ops/s.\n", thruput); … … 111 111 * 112 112 */ 113 static void compute_stats(bench meter_t *meter, size_t stopwatch_count,113 static void compute_stats(bench_run_t *runs, size_t run_count, 114 114 uint64_t workload_size, double precision, double *out_duration_avg, 115 115 double *out_duration_sigma, double *out_thruput_avg) … … 119 119 double nanos_sum2 = 0.0; 120 120 121 for (size_t i = 0; i < stopwatch_count; i++) {122 double nanos = stopwatch_get_nanos(& meter[i].stopwatch);121 for (size_t i = 0; i < run_count; i++) { 122 double nanos = stopwatch_get_nanos(&runs[i].stopwatch); 123 123 double thruput = (double) workload_size / nanos; 124 124 … … 127 127 nanos_sum2 += nanos * nanos; 128 128 } 129 *out_duration_avg = nanos_sum / stopwatch_count;129 *out_duration_avg = nanos_sum / run_count; 130 130 double sigma2 = (nanos_sum2 - nanos_sum * (*out_duration_avg)) / 131 ((double) stopwatch_count - 1);131 ((double) run_count - 1); 132 132 // FIXME: implement sqrt properly 133 133 *out_duration_sigma = estimate_square_root(sigma2, precision); 134 *out_thruput_avg = 1.0 / (inv_thruput_sum / stopwatch_count);135 } 136 137 static void summary_stats(bench meter_t *meter, size_t meter_count,134 *out_thruput_avg = 1.0 / (inv_thruput_sum / run_count); 135 } 136 137 static void summary_stats(bench_run_t *runs, size_t run_count, 138 138 benchmark_t *bench, uint64_t workload_size) 139 139 { 140 140 double duration_avg, duration_sigma, thruput_avg; 141 compute_stats( meter, meter_count, workload_size, 0.001,141 compute_stats(runs, run_count, workload_size, 0.001, 142 142 &duration_avg, &duration_sigma, &thruput_avg); 143 143 … … 145 145 "%.0f ops/s; Samples: %zu\n", 146 146 workload_size, duration_avg / 1000.0, duration_sigma / 1000.0, 147 thruput_avg * 1000000000.0, meter_count);147 thruput_avg * 1000000000.0, run_count); 148 148 } 149 149 … … 152 152 printf("Warm up and determine workload size...\n"); 153 153 154 /* 155 * We share this buffer across all runs as we know that it is 156 * used only on failure (and we abort after first error). 157 */ 154 158 char *error_msg = malloc(MAX_ERROR_STR_LENGTH + 1); 155 159 if (error_msg == NULL) { … … 159 163 str_cpy(error_msg, MAX_ERROR_STR_LENGTH, ""); 160 164 165 bench_run_t helper_run; 166 bench_run_init(&helper_run, error_msg, MAX_ERROR_STR_LENGTH); 167 161 168 bool ret = true; 162 169 163 170 if (bench->setup != NULL) { 164 ret = bench->setup( error_msg, MAX_ERROR_STR_LENGTH);171 ret = bench->setup(&helper_run); 165 172 if (!ret) { 166 173 goto leave_error; … … 180 187 workload_size = ((uint64_t) 1) << bits; 181 188 182 benchmeter_t meter; 183 benchmeter_init(&meter); 184 185 bool ok = bench->entry(&meter, workload_size, 186 error_msg, MAX_ERROR_STR_LENGTH); 189 bench_run_t run; 190 bench_run_init(&run, error_msg, MAX_ERROR_STR_LENGTH); 191 192 bool ok = bench->entry(&run, workload_size); 187 193 if (!ok) { 188 194 goto leave_error; 189 195 } 190 short_report(& meter, -1, bench, workload_size);191 192 nsec_t duration = stopwatch_get_nanos(& meter.stopwatch);196 short_report(&run, -1, bench, workload_size); 197 198 nsec_t duration = stopwatch_get_nanos(&run.stopwatch); 193 199 if (duration > SEC2NSEC(MIN_DURATION_SECS)) { 194 200 break; … … 198 204 printf("Workload size set to %" PRIu64 ", measuring %d samples.\n", workload_size, NUM_SAMPLES); 199 205 200 bench meter_t *meter = calloc(NUM_SAMPLES, sizeof(benchmeter_t));201 if ( meter== NULL) {206 bench_run_t *runs = calloc(NUM_SAMPLES, sizeof(bench_run_t)); 207 if (runs == NULL) { 202 208 snprintf(error_msg, MAX_ERROR_STR_LENGTH, "failed allocating memory"); 203 209 goto leave_error; 204 210 } 205 211 for (int i = 0; i < NUM_SAMPLES; i++) { 206 benchmeter_init(&meter[i]); 207 208 bool ok = bench->entry(&meter[i], workload_size, 209 error_msg, MAX_ERROR_STR_LENGTH); 212 bench_run_init(&runs[i], error_msg, MAX_ERROR_STR_LENGTH); 213 214 bool ok = bench->entry(&runs[i], workload_size); 210 215 if (!ok) { 211 free( meter);216 free(runs); 212 217 goto leave_error; 213 218 } 214 short_report(& meter[i], i, bench, workload_size);215 } 216 217 summary_stats( meter, NUM_SAMPLES, bench, workload_size);219 short_report(&runs[i], i, bench, workload_size); 220 } 221 222 summary_stats(runs, NUM_SAMPLES, bench, workload_size); 218 223 printf("\nBenchmark completed\n"); 219 224 220 free( meter);225 free(runs); 221 226 222 227 goto leave; … … 228 233 leave: 229 234 if (bench->teardown != NULL) { 230 bool ok = bench->teardown( error_msg, MAX_ERROR_STR_LENGTH);235 bool ok = bench->teardown(&helper_run); 231 236 if (!ok) { 232 237 printf("Error: %s\n", error_msg);
Note:
See TracChangeset
for help on using the changeset viewer.