source: benchmark/benchcltr.hfa @ 221c542e

Last change on this file since 221c542e was e54d0c3, checked in by Peter A. Buhr <pabuhr@…>, 4 years ago

Fixed benchmarks after another change to getTimeNsec()

  • Property mode set to 100644
File size: 4.4 KB
Line 
1#pragma once
2#include <assert.h>
3#include <stdint.h>
4
5#ifdef __cforall
6        #include <kernel.hfa>
7        #include <thread.hfa>
8        #include <stats.hfa>
9#else
10#include <time.h>                                                                               // timespec
11#include <sys/time.h>                                                                   // timeval
12
13enum { TIMEGRAN = 1000000000LL };                                       // nanosecond granularity, except for timeval
14#endif
15
16#define BENCH_OPT_SHORT "d:p:t:SPV"
17#define BENCH_OPT_LONG \
18        {"duration",     required_argument, 0, 'd'}, \
19        {"nthreads",     required_argument, 0, 't'}, \
20        {"nprocs",       required_argument, 0, 'p'}, \
21        {"nostats",      no_argument      , 0, 'S'}, \
22        {"procstat",     no_argument      , 0, 'P'}, \
23        {"viewhalts",    no_argument      , 0, 'V'},
24
25#define BENCH_OPT_CASE \
26        case 'd': \
27                duration = strtod(arg, &end); \
28                if(*end != '\0') { \
29                        fprintf(stderr, "Duration must be a valid double, was %s\n", arg); \
30                        goto usage; \
31                } \
32                break; \
33        case 't': \
34                nthreads = strtoul(arg, &end, 10); \
35                if(*end != '\0' || nthreads < 1) { \
36                        fprintf(stderr, "Number of threads must be a positive integer, was %s\n", arg); \
37                        goto usage; \
38                } \
39                break; \
40        case 'p': \
41                nprocs = strtoul(arg, &end, 10); \
42                if(*end != '\0' || nprocs < 1) { \
43                        fprintf(stderr, "Number of processors must be a positive integer, was %s\n", arg); \
44                        goto usage; \
45                } \
46                break; \
47        case 'S': \
48                silent = true; \
49                break; \
50        case 'P': \
51                procstats = true; \
52                break; \
53        case 'V': \
54                viewhalts = true; \
55                break;
56
57double duration = 5;
58int nprocs = 1;
59int nthreads = 1;
60bool silent = false;
61bool continuous = false;
62bool procstats = false;
63bool viewhalts = false;
64
65#define BENCH_OPT_CFA \
66        {'d', "duration",  "Duration of the experiments in seconds", duration }, \
67        {'t', "nthreads",  "Number of threads to use", nthreads }, \
68        {'p', "nprocs",    "Number of processors to use", nprocs }, \
69        {'S', "nostats",   "Don't print statistics", silent, parse_settrue }, \
70        {'C', "constats",  "Regularly print statistics", continuous, parse_settrue }, \
71        {'P', "procstat",  "Print statistics for each processors", procstats, parse_settrue }, \
72        {'V', "viewhalts", "Visualize halts, prints timestamp and Processor id for each halt.", viewhalts, parse_settrue },
73
74#ifdef __cforall
75#include <parseargs.hfa>
76
77struct cluster * the_benchmark_cluster = 0p;
78struct BenchCluster {
79        cluster self;
80};
81
82void ?{}( BenchCluster & this, int num_io, const io_context_params & io_params, int stats ) {
83        (this.self){ "Benchmark Cluster", num_io, io_params };
84
85        assert( the_benchmark_cluster == 0p );
86        the_benchmark_cluster = &this.self;
87
88        #if !defined(__CFA_NO_STATISTICS__)
89                if( !silent ) {
90                        print_stats_at_exit( this.self, stats );
91                }
92        #endif
93}
94
95struct BenchProc {
96        processor self;
97};
98
99void ?{}( BenchProc & this ) {
100        assert( the_benchmark_cluster != 0p );
101        (this.self){ "Benchmark Processor", *the_benchmark_cluster };
102
103        #if !defined(__CFA_NO_STATISTICS__)
104                if( procstats ) {
105                        print_stats_at_exit( this.self, the_benchmark_cluster->print_stats );
106                }
107                if( viewhalts ) {
108                        print_halts( this.self );
109                }
110        #endif
111}
112
113void wait(double duration, Time & start, Time & end, bool is_tty) {
114        for() {
115                sleep(100`ms);
116                end = timeHiRes();
117                Duration delta = end - start;
118                /*if(is_tty)*/ {
119                        printf(" %.1f\r", delta`ds);
120                        fflush(stdout);
121                }
122                if( delta >= duration`s ) {
123                        break;
124                }
125        }
126}
127#else
128uint64_t timeHiRes() {
129        timespec curr;
130        clock_gettime( CLOCK_REALTIME, &curr );
131        return (int64_t)curr.tv_sec * TIMEGRAN + curr.tv_nsec;
132}
133
134uint64_t to_miliseconds( uint64_t durtn ) { return durtn / (TIMEGRAN / 1000LL); }
135double to_fseconds(uint64_t durtn ) { return durtn / (double)TIMEGRAN; }
136uint64_t from_fseconds(double sec) { return sec * TIMEGRAN; }
137
138
139void wait_duration(double duration, uint64_t & start, uint64_t & end, bool is_tty) {
140        for(;;) {
141                usleep(100000);
142                end = timeHiRes();
143                uint64_t delta = end - start;
144                /*if(is_tty)*/ {
145                        printf(" %.1f\r", to_fseconds(delta));
146                        fflush(stdout);
147                }
148                if( delta >= from_fseconds(duration) ) {
149                        break;
150                }
151        }
152}
153#endif
154
155
156void bench_usage( char * argv [] ) {
157        fprintf( stderr, "Usage: %s : [options]\n", argv[0] );
158        fprintf( stderr, "\n" );
159        fprintf( stderr, "  -d, --duration=DURATION  Duration of the experiment, in seconds\n" );
160        fprintf( stderr, "  -t, --nthreads=NTHREADS  Number of user threads\n" );
161        fprintf( stderr, "  -p, --nprocs=NPROCS      Number of kernel threads\n" );
162        fprintf( stderr, "  -S, --nostats            Don't print cluster stats\n" );
163        fprintf( stderr, "  -P, --procstat           Print processor stats" );
164}
Note: See TracBrowser for help on using the repository browser.