Changeset e7f9a09 in mainline for uspace/app/hbench/main.c


Ignore:
Timestamp:
2019-01-21T13:20:31Z (7 years ago)
Author:
Vojtech Horky <vojtech.horky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d17cf8c
Parents:
94ebebf
Message:

hbench: less parameters to benchmark runners

Merge stopwatch as well as error message buffer into one structure to
simplify benchmark runner signature.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/hbench/main.c

    r94ebebf re7f9a09  
    5353#define MAX_ERROR_STR_LENGTH 1024
    5454
    55 static void short_report(benchmeter_t *meter, int run_index,
     55static void short_report(bench_run_t *info, int run_index,
    5656    benchmark_t *bench, uint64_t workload_size)
    5757{
    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));
    6161
    6262        printf("Completed %" PRIu64 " operations in %llu us",
    6363            workload_size, duration_usec);
    6464        if (duration_usec > 0) {
    65                 double nanos = stopwatch_get_nanos(&meter->stopwatch);
     65                double nanos = stopwatch_get_nanos(&info->stopwatch);
    6666                double thruput = (double) workload_size / (nanos / 1000000000.0l);
    6767                printf(", %.0f ops/s.\n", thruput);
     
    111111 *
    112112 */
    113 static void compute_stats(benchmeter_t *meter, size_t stopwatch_count,
     113static void compute_stats(bench_run_t *runs, size_t run_count,
    114114    uint64_t workload_size, double precision, double *out_duration_avg,
    115115    double *out_duration_sigma, double *out_thruput_avg)
     
    119119        double nanos_sum2 = 0.0;
    120120
    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);
    123123                double thruput = (double) workload_size / nanos;
    124124
     
    127127                nanos_sum2 += nanos * nanos;
    128128        }
    129         *out_duration_avg = nanos_sum / stopwatch_count;
     129        *out_duration_avg = nanos_sum / run_count;
    130130        double sigma2 = (nanos_sum2 - nanos_sum * (*out_duration_avg)) /
    131             ((double) stopwatch_count - 1);
     131            ((double) run_count - 1);
    132132        // FIXME: implement sqrt properly
    133133        *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(benchmeter_t *meter, size_t meter_count,
     134        *out_thruput_avg = 1.0 / (inv_thruput_sum / run_count);
     135}
     136
     137static void summary_stats(bench_run_t *runs, size_t run_count,
    138138    benchmark_t *bench, uint64_t workload_size)
    139139{
    140140        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,
    142142            &duration_avg, &duration_sigma, &thruput_avg);
    143143
     
    145145            "%.0f ops/s; Samples: %zu\n",
    146146            workload_size, duration_avg / 1000.0, duration_sigma / 1000.0,
    147             thruput_avg * 1000000000.0, meter_count);
     147            thruput_avg * 1000000000.0, run_count);
    148148}
    149149
     
    152152        printf("Warm up and determine workload size...\n");
    153153
     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         */
    154158        char *error_msg = malloc(MAX_ERROR_STR_LENGTH + 1);
    155159        if (error_msg == NULL) {
     
    159163        str_cpy(error_msg, MAX_ERROR_STR_LENGTH, "");
    160164
     165        bench_run_t helper_run;
     166        bench_run_init(&helper_run, error_msg, MAX_ERROR_STR_LENGTH);
     167
    161168        bool ret = true;
    162169
    163170        if (bench->setup != NULL) {
    164                 ret = bench->setup(error_msg, MAX_ERROR_STR_LENGTH);
     171                ret = bench->setup(&helper_run);
    165172                if (!ret) {
    166173                        goto leave_error;
     
    180187                workload_size = ((uint64_t) 1) << bits;
    181188
    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);
    187193                if (!ok) {
    188194                        goto leave_error;
    189195                }
    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);
    193199                if (duration > SEC2NSEC(MIN_DURATION_SECS)) {
    194200                        break;
     
    198204        printf("Workload size set to %" PRIu64 ", measuring %d samples.\n", workload_size, NUM_SAMPLES);
    199205
    200         benchmeter_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) {
    202208                snprintf(error_msg, MAX_ERROR_STR_LENGTH, "failed allocating memory");
    203209                goto leave_error;
    204210        }
    205211        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);
    210215                if (!ok) {
    211                         free(meter);
     216                        free(runs);
    212217                        goto leave_error;
    213218                }
    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);
    218223        printf("\nBenchmark completed\n");
    219224
    220         free(meter);
     225        free(runs);
    221226
    222227        goto leave;
     
    228233leave:
    229234        if (bench->teardown != NULL) {
    230                 bool ok = bench->teardown(error_msg, MAX_ERROR_STR_LENGTH);
     235                bool ok = bench->teardown(&helper_run);
    231236                if (!ok) {
    232237                        printf("Error: %s\n", error_msg);
Note: See TracChangeset for help on using the changeset viewer.