- Timestamp:
- Aug 15, 2020, 12:20:44 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum, stuck-waitfor-destruct
- Children:
- 36de20d
- Parents:
- 7f51b9d (diff), 5715d43 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- benchmark
- Files:
-
- 1 added
- 3 edited
-
benchcltr.hfa (modified) (5 diffs)
-
io/readv-posix.c (added)
-
io/readv.cfa (modified) (2 diffs)
-
readyQ/yield.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/benchcltr.hfa
r7f51b9d r762fbc1 1 1 #pragma once 2 #include <assert.h> 3 #include <stdint.h> 2 4 3 #include <assert.h> 4 #include <kernel.hfa> 5 #include <thread.hfa> 6 #include <stats.hfa> 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 13 enum { TIMEGRAN = 1000000000LL }; // nanosecond granularity, except for timeval 14 #endif 7 15 8 16 #define BENCH_OPT_SHORT "d:p:t:SPV" … … 14 22 {"procstat", no_argument , 0, 'P'}, \ 15 23 {"viewhalts", no_argument , 0, 'V'}, 16 17 #define BENCH_DECL \18 double duration = 5; \19 int nprocs = 1; \20 int nthreads = 1;21 24 22 25 #define BENCH_OPT_CASE \ … … 52 55 break; 53 56 57 double duration = 5; 58 int nprocs = 1; 59 int nthreads = 1; 54 60 bool silent = false; 61 bool continuous = false; 55 62 bool procstats = false; 56 63 bool 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 57 77 struct cluster * the_benchmark_cluster = 0p; 58 78 struct BenchCluster { … … 60 80 }; 61 81 62 void ?{}( BenchCluster & this, int flags, int stats ) {63 (this.self){ "Benchmark Cluster", flags };82 void ?{}( BenchCluster & this, int num_io, const io_context_params & io_params, int stats ) { 83 (this.self){ "Benchmark Cluster", num_io, io_params }; 64 84 65 85 assert( the_benchmark_cluster == 0p ); … … 105 125 } 106 126 } 127 #else 128 uint64_t getTimeNsec() { 129 timespec curr; 130 clock_gettime( CLOCK_REALTIME, &curr ); 131 return (int64_t)curr.tv_sec * TIMEGRAN + curr.tv_nsec; 132 } 133 134 uint64_t to_miliseconds( uint64_t durtn ) { return durtn / (TIMEGRAN / 1000LL); } 135 double to_fseconds(uint64_t durtn ) { return durtn / (double)TIMEGRAN; } 136 uint64_t from_fseconds(double sec) { return sec * TIMEGRAN; } 137 138 139 void wait_duration(double duration, uint64_t & start, uint64_t & end, bool is_tty) { 140 for(;;) { 141 usleep(100000); 142 end = getTimeNsec(); 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 107 155 108 156 void bench_usage( char * argv [] ) { -
benchmark/io/readv.cfa
r7f51b9d r762fbc1 40 40 int do_read(int fd, struct iovec * iov) { 41 41 // extern ssize_t cfa_preadv2(int, const struct iovec *, int, off_t, int, int = 0, Duration = -1`s, io_cancellation * = 0p, io_context * = 0p); 42 int sflags = 0; 42 int sflags = 0 43 #if defined(CFA_HAVE_IOSQE_ASYNC) 44 | CFA_IO_ASYNC 45 #else 46 #warning no CFA_IO_ASYNC support 47 #endif 48 ; 43 49 if(fixed_file) { 44 50 sflags |= CFA_IO_FIXED_FD1; … … 63 69 64 70 int main(int argc, char * argv[]) { 65 BENCH_DECL71 int file_flags = 0; 66 72 unsigned num_io = 1; 67 io_context_params params;68 int file_flags = 0;69 73 unsigned sublen = 16; 74 unsigned nentries = 0; 70 75 71 arg_loop: 72 for(;;) { 73 static struct option options[] = { 74 BENCH_OPT_LONG 75 {"bufsize", required_argument, 0, 'b'}, 76 {"submitthread", no_argument , 0, 's'}, 77 {"eagersubmit", no_argument , 0, 'e'}, 78 {"kpollsubmit", no_argument , 0, 'k'}, 79 {"kpollcomplete", no_argument , 0, 'i'}, 80 {"fixed-files", no_argument , 0, 'f'}, 81 {"open-direct", no_argument , 0, 'o'}, 82 {"submitlength", required_argument, 0, 'l'}, 83 {0, 0, 0, 0} 84 }; 76 bool subthrd = false; 77 bool subeagr = false; 78 bool odirect = false; 79 bool kpollsb = false; 80 bool kpollcp = false; 85 81 86 int idx = 0; 87 int opt = getopt_long(argc, argv, BENCH_OPT_SHORT "b:sekil:", options, &idx); 82 cfa_option opt[] = { 83 BENCH_OPT_CFA 84 {'b', "bufsize", "Number of bytes to read per request", buflen}, 85 {'s', "submitthread", "If set, cluster uses polling thread to submit I/O", subthrd, parse_settrue}, 86 {'e', "eagersubmit", "If set, cluster submits I/O eagerly but still aggregates submits", subeagr, parse_settrue}, 87 {'f', "fixed-files", "Pre-register files with the io_contexts", fixed_file, parse_settrue}, 88 {'o', "open-direct", "Open files with O_DIRECT flag, bypassing the file cache", odirect, parse_settrue}, 89 {'k', "kpollsubmit", "If set, cluster uses an in kernel thread to poll submission, implies -f, requires elevated permissions", kpollsb, parse_settrue}, 90 {'i', "kpollcomplete", "If set, cluster polls fds for completions instead of relying on interrupts to get notifications, implies -o", kpollcp, parse_settrue}, 91 {'l', "submitlength", "Size of the buffer that stores ready submissions", sublen}, 92 {'r', "numentries", "Number of entries each of the io_context have", nentries}, 93 {'n', "numcontexts", "Number of io_contexts to the cluster", num_io}, 94 }; 95 int opt_cnt = sizeof(opt) / sizeof(cfa_option); 88 96 89 const char * arg = optarg ? optarg : ""; 90 char * end; 91 switch(opt) { 92 // Exit Case 93 case -1: 94 break arg_loop; 95 BENCH_OPT_CASE 96 case 'b': 97 buflen = strtoul(arg, &end, 10); 98 if(*end != '\0' && buflen < 10) { 99 fprintf(stderr, "Buffer size must be at least 10, was %s\n", arg); 100 goto usage; 101 } 102 break; 103 case 's': 104 params.poller_submits = true; 105 break; 106 case 'e': 107 params.eager_submits = true; 108 break; 109 case 'k': 110 params.poll_submit = true; 111 case 'f': 112 fixed_file = true; 113 break; 114 case 'i': 115 params.poll_complete = true; 116 case 'o': 117 file_flags |= O_DIRECT; 118 break; 119 case 'l': 120 sublen = strtoul(arg, &end, 10); 121 if(*end != '\0' && sublen < 16) { 122 fprintf(stderr, "Submit length must be at least 16, was %s\n", arg); 123 goto usage; 124 } 125 // flags |= (sublen << CFA_CLUSTER_IO_BUFFLEN_OFFSET); 126 break; 127 default: /* ? */ 128 fprintf(stderr, "%d\n", opt); 129 usage: 130 bench_usage( argv ); 131 fprintf( stderr, " -b, --buflen=SIZE Number of bytes to read per request\n" ); 132 fprintf( stderr, " -u, --userthread If set, cluster uses user-thread to poll I/O\n" ); 133 fprintf( stderr, " -s, --submitthread If set, cluster uses polling thread to submit I/O\n" ); 134 fprintf( stderr, " -e, --eagersubmit If set, cluster submits I/O eagerly but still aggregates submits\n" ); 135 fprintf( stderr, " -k, --kpollsubmit If set, cluster uses IORING_SETUP_SQPOLL\n" ); 136 fprintf( stderr, " -i, --kpollcomplete If set, cluster uses IORING_SETUP_IOPOLL\n" ); 137 fprintf( stderr, " -l, --submitlength=LEN Max number of submitions that can be submitted together\n" ); 138 exit(EXIT_FAILURE); 97 char **left; 98 parse_args( opt, opt_cnt, "[OPTIONS]...\ncforall yield benchmark", left ); 99 100 if(kpollcp || odirect) { 101 if( (buflen % 512) != 0 ) { 102 fprintf(stderr, "Buffer length must be a multiple of 512 when using O_DIRECT, was %lu\n\n", buflen); 103 print_args_usage(opt, opt_cnt, "[OPTIONS]...\ncforall yield benchmark", true); 139 104 } 140 105 } 106 107 io_context_params params; 108 109 if( subthrd ) params.poller_submits = true; 110 if( subeagr ) params.eager_submits = true; 111 if( kpollsb ) params.poll_submit = true; 112 if( kpollcp ) params.poll_complete = true; 113 114 if(params.poll_submit ) fixed_file = true; 115 if(params.poll_complete) odirect = true; 116 117 params.num_ready = sublen; 118 params.num_entries = nentries; 119 120 if(odirect) file_flags |= O_DIRECT; 141 121 142 122 int lfd = open(__FILE__, file_flags); -
benchmark/readyQ/yield.cfa
r7f51b9d r762fbc1 43 43 44 44 int main(int argc, char * argv[]) { 45 BENCH_DECL 45 unsigned num_io = 1; 46 io_context_params params; 46 47 47 for(;;) { 48 static struct option options[] = { 49 BENCH_OPT_LONG 50 {0, 0, 0, 0} 51 }; 48 cfa_option opt[] = { 49 BENCH_OPT_CFA 50 }; 51 int opt_cnt = sizeof(opt) / sizeof(cfa_option); 52 52 53 int idx = 0; 54 int opt = getopt_long(argc, argv, BENCH_OPT_SHORT, options, &idx); 55 56 const char * arg = optarg ? optarg : ""; 57 char * end; 58 switch(opt) { 59 case -1: 60 goto run; 61 BENCH_OPT_CASE 62 default: /* ? */ 63 fprintf( stderr, "Unkown option '%c'\n", opt); 64 usage: 65 bench_usage( argv ); 66 exit(1); 67 } 68 } 69 run: 53 char **left; 54 parse_args( argc, argv, opt, opt_cnt, "[OPTIONS]...\ncforall yield benchmark", left ); 70 55 71 56 { … … 73 58 74 59 Time start, end; 75 BenchCluster cl = { 0, CFA_STATS_READY_Q };60 BenchCluster cl = { num_io, params, CFA_STATS_READY_Q }; 76 61 { 77 62 BenchProc procs[nprocs];
Note:
See TracChangeset
for help on using the changeset viewer.