- Timestamp:
- Oct 7, 2020, 4:31:43 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 848439f
- Parents:
- ae2c27a (diff), 597c5d18 (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:
-
- 15 edited
-
Makefile.am (modified) (12 diffs)
-
creation/JavaThread.java (modified) (3 diffs)
-
ctxswitch/JavaThread.java (modified) (2 diffs)
-
io/http/filecache.cfa (modified) (7 diffs)
-
io/http/main.cfa (modified) (5 diffs)
-
io/http/options.cfa (modified) (5 diffs)
-
io/http/options.hfa (modified) (2 diffs)
-
io/http/protocol.cfa (modified) (6 diffs)
-
io/http/worker.cfa (modified) (3 diffs)
-
io/http/worker.hfa (modified) (3 diffs)
-
io/readv.cfa (modified) (2 diffs)
-
mutex/JavaThread.java (modified) (3 diffs)
-
mutexC/JavaThread.java (modified) (4 diffs)
-
readyQ/yield.cfa (modified) (2 diffs)
-
schedint/JavaThread.java (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/Makefile.am
rae2c27a rc76bd34 113 113 creation_cfa_generator_DURATION = 1000000000 114 114 creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION} 115 creation_cfa_thread_DURATION = 10000000116 creation_upp_thread_DURATION = ${creation_cfa_thread_DURATION}117 115 creation_DURATION = 10000000 118 116 … … 148 146 149 147 cleancsv: 150 rm -f compile.csv basic.csv ctxswitch.csv mutex.csv sched uling.csv148 rm -f compile.csv basic.csv ctxswitch.csv mutex.csv schedint.csv 151 149 152 150 jenkins$(EXEEXT): cleancsv … … 159 157 +make mutex.csv 160 158 -+make mutex.diff.csv 161 +make sched uling.csv162 -+make sched uling.diff.csv159 +make schedint.csv 160 -+make schedint.diff.csv 163 161 @DOifskipcompile@ 164 162 cat compile.csv … … 169 167 cat mutex.csv 170 168 -cat mutex.diff.csv 171 cat sched uling.csv172 -cat sched uling.diff.csv169 cat schedint.csv 170 -cat schedint.diff.csv 173 171 174 172 compile.csv: … … 200 198 $(srcdir)/fixcsv.sh $@ 201 199 202 sched uling.csv:200 schedint.csv: 203 201 echo "building $@" 204 202 echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@ … … 291 289 ctxswitch-python_coroutine$(EXEEXT): 292 290 $(BENCH_V_PY)echo "#!/bin/sh" > a.out 293 echo "python3 .7 $(srcdir)/ctxswitch/python_cor.py" >> a.out291 echo "python3 $(srcdir)/ctxswitch/python_cor.py \"$$""@\"" >> a.out 294 292 chmod a+x a.out 295 293 296 294 ctxswitch-nodejs_coroutine$(EXEEXT): 297 295 $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out 298 echo "nodejs $(srcdir)/ctxswitch/node_cor.js " >> a.out296 echo "nodejs $(srcdir)/ctxswitch/node_cor.js \"$$""@\"" >> a.out 299 297 chmod a+x a.out 300 298 301 299 ctxswitch-nodejs_await$(EXEEXT): 302 300 $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out 303 echo "nodejs $(srcdir)/ctxswitch/node_await.js " >> a.out301 echo "nodejs $(srcdir)/ctxswitch/node_await.js \"$$""@\"" >> a.out 304 302 chmod a+x a.out 305 303 … … 313 311 $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java 314 312 echo "#!/bin/sh" > a.out 315 echo "java JavaThread " >> a.out313 echo "java JavaThread \"$$""@\"" >> a.out 316 314 chmod a+x a.out 317 315 … … 355 353 $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java 356 354 echo "#!/bin/sh" > a.out 357 echo "java JavaThread " >> a.out355 echo "java JavaThread \"$$""@\"" >> a.out 358 356 chmod a+x a.out 359 357 … … 387 385 $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java 388 386 echo "#!/bin/sh" > a.out 389 echo "java JavaThread " >> a.out387 echo "java JavaThread \"$$""@\"" >> a.out 390 388 chmod a+x a.out 391 389 … … 454 452 creation-python_coroutine$(EXEEXT): 455 453 $(BENCH_V_PY)echo "#!/bin/sh" > a.out 456 echo "python3 .7 $(srcdir)/creation/python_cor.py" >> a.out454 echo "python3 $(srcdir)/creation/python_cor.py \"$$""@\"" >> a.out 457 455 chmod a+x a.out 458 456 459 457 creation-nodejs_coroutine$(EXEEXT): 460 458 $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out 461 echo "nodejs $(srcdir)/creation/node_cor.js " >> a.out459 echo "nodejs $(srcdir)/creation/node_cor.js \"$$""@\"" >> a.out 462 460 chmod a+x a.out 463 461 … … 471 469 $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java 472 470 echo "#!/bin/sh" > a.out 473 echo "java JavaThread " >> a.out471 echo "java JavaThread \"$$""@\"" >> a.out 474 472 chmod a+x a.out 475 473 … … 492 490 493 491 compile-array$(EXEEXT): 494 $(CFACOMPILE) - fsyntax-only -w $(testdir)/array.cfa492 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/array.cfa 495 493 496 494 compile-attributes$(EXEEXT): 497 $(CFACOMPILE) - fsyntax-only -w $(testdir)/attributes.cfa495 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/attributes.cfa 498 496 499 497 compile-empty$(EXEEXT): 500 $(CFACOMPILE) - fsyntax-only -w $(srcdir)/compile/empty.cfa498 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(srcdir)/compile/empty.cfa 501 499 502 500 compile-expression$(EXEEXT): 503 $(CFACOMPILE) - fsyntax-only -w $(testdir)/expression.cfa501 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/expression.cfa 504 502 505 503 compile-io$(EXEEXT): 506 $(CFACOMPILE) - fsyntax-only -w $(testdir)/io1.cfa504 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/io1.cfa 507 505 508 506 compile-monitor$(EXEEXT): 509 $(CFACOMPILE) - fsyntax-only -w $(testdir)/concurrent/monitor.cfa507 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/concurrent/monitor.cfa 510 508 511 509 compile-operators$(EXEEXT): 512 $(CFACOMPILE) - fsyntax-only -w $(testdir)/operators.cfa510 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/operators.cfa 513 511 514 512 compile-thread$(EXEEXT): 515 $(CFACOMPILE) - fsyntax-only -w $(testdir)/concurrent/thread.cfa513 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/concurrent/thread.cfa 516 514 517 515 compile-typeof$(EXEEXT): 518 $(CFACOMPILE) - fsyntax-only -w $(testdir)/typeof.cfa516 $(CFACOMPILE) -DNO_COMPILED_PRAGMA -fsyntax-only -w $(testdir)/typeof.cfa 519 517 520 518 ## ========================================================================================================= -
benchmark/creation/JavaThread.java
rae2c27a rc76bd34 1 1 public class JavaThread { 2 2 // Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator. 3 // Bijective 3 // Bijective 4 4 // Cycle length for non-zero values is 4G-1. 5 5 // 0 is absorbing and should be avoided -- fixed point. 6 6 // The returned value is typically masked to produce a positive value. 7 static volatile int Ticket = 0 ; 7 static volatile int Ticket = 0 ; 8 8 9 9 private static int nextRandom (int x) { 10 if (x == 0) { 10 if (x == 0) { 11 11 // reseed the PRNG 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 20 20 } 21 21 x ^= x << 6; 22 22 x ^= x >>> 21; 23 23 x ^= x << 7; 24 return x ; 24 return x ; 25 25 } 26 26 static int x = 2; 27 27 28 static private int times = Integer.parseInt("10000") ;28 static private long times = Long.parseLong("10000") ; 29 29 30 30 public static class MyThread extends Thread { … … 33 33 } 34 34 public static void helper() throws InterruptedException { 35 for( inti = 1; i <= times; i += 1) {35 for(long i = 1; i <= times; i += 1) { 36 36 MyThread m = new MyThread(); 37 37 x = nextRandom( x ); … … 47 47 } 48 48 public static void main(String[] args) throws InterruptedException { 49 if ( args.length > 2) System.exit( 1 );50 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }49 if ( args.length > 1 ) System.exit( 1 ); 50 if ( args.length == 1 ) { times = Long.parseLong(args[0]); } 51 51 52 for (int i = Integer.parseInt("5"); --i >= 0 ; ) { 52 for (int i = Integer.parseInt("5"); --i >= 0 ; ) { 53 53 InnerMain(); 54 54 Thread.sleep(2000); // 2 seconds -
benchmark/ctxswitch/JavaThread.java
rae2c27a rc76bd34 1 1 public class JavaThread { 2 2 // Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator. 3 // Bijective 3 // Bijective 4 4 // Cycle length for non-zero values is 4G-1. 5 5 // 0 is absorbing and should be avoided -- fixed point. 6 6 // The returned value is typically masked to produce a positive value. 7 static volatile int Ticket = 0 ; 7 static volatile int Ticket = 0 ; 8 8 9 9 private static int nextRandom (int x) { 10 if (x == 0) { 10 if (x == 0) { 11 11 // reseed the PRNG 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 20 20 } 21 21 x ^= x << 6; 22 22 x ^= x >>> 21; 23 23 x ^= x << 7; 24 return x ; 24 return x ; 25 25 } 26 26 static int x = 2; 27 27 28 static private int times = Integer.parseInt("100000");28 static private long times = Long.parseLong("100000"); 29 29 30 30 public static void helper() { 31 for( inti = 1; i <= times; i += 1) {31 for(long i = 1; i <= times; i += 1) { 32 32 Thread.yield(); 33 33 } … … 40 40 } 41 41 public static void main(String[] args) throws InterruptedException { 42 if ( args.length > 2) System.exit( 1 );43 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }42 if ( args.length > 1 ) System.exit( 1 ); 43 if ( args.length == 1 ) { times = Long.parseLong(args[0]); } 44 44 45 45 for (int i = Integer.parseInt("5"); --i >= 0 ; ) { -
benchmark/io/http/filecache.cfa
rae2c27a rc76bd34 73 73 cache_line * entries; 74 74 size_t size; 75 int * rawfds; 76 int nfds; 75 77 } file_cache; 76 78 … … 98 100 } 99 101 100 int put_file( cache_line & entry ) {102 int put_file( cache_line & entry, int fd ) { 101 103 uint32_t idx = murmur3_32( (const uint8_t *)entry.file, strlen(entry.file), options.file_cache.hash_seed ) % file_cache.size; 102 104 … … 108 110 109 111 file_cache.entries[idx] = entry; 112 file_cache.entries[idx].fd = fd; 110 113 return i > 0 ? 1 : 0; 111 114 } … … 121 124 size_t fcount = 0; 122 125 size_t fsize = 16; 123 cache_line * raw = 0p; 124 raw = alloc(raw, fsize, true); 126 cache_line * raw = alloc(fsize); 125 127 // Step 1 get a dense array of all files 126 128 int walk(const char *fpath, const struct stat *sb, int typeflag) { … … 131 133 if(fcount > fsize) { 132 134 fsize *= 2; 133 raw = alloc( raw, fsize, true);135 raw = alloc(fsize, raw`realloc); 134 136 } 135 137 … … 162 164 file_cache.entries = anew(file_cache.size); 163 165 166 if(options.file_cache.fixed_fds) { 167 file_cache.nfds = fcount; 168 file_cache.rawfds = alloc(fcount); 169 } 170 164 171 // Step 3 fill the cache 165 172 int conflicts = 0; 166 173 for(i; fcount) { 167 conflicts += put_file( raw[i] ); 174 int fd; 175 if(options.file_cache.fixed_fds) { 176 file_cache.rawfds[i] = raw[i].fd; 177 fd = i; 178 } 179 else { 180 fd = raw[i].fd; 181 } 182 conflicts += put_file( raw[i], fd ); 168 183 } 169 184 printf("Filled cache from path \"%s\" with %zu files\n", path, fcount); … … 197 212 } 198 213 199 return [aalloc(extra), 0]; 214 size_t s = file_cache.nfds + extra; 215 int * data = alloc(s, file_cache.rawfds`realloc); 216 return [data, file_cache.nfds]; 200 217 } 201 218 -
benchmark/io/http/main.cfa
rae2c27a rc76bd34 12 12 #include <kernel.hfa> 13 13 #include <stats.hfa> 14 #include <time.hfa> 14 15 #include <thread.hfa> 15 16 16 #include "channel.hfa"17 17 #include "filecache.hfa" 18 18 #include "options.hfa" 19 19 #include "worker.hfa" 20 20 21 extern void register_fixed_files( cluster &, int *, unsigned count ); 22 23 Duration default_preemption() { 24 return 0; 25 } 26 21 27 //============================================================================================= 22 28 // Globals 23 29 //============================================================================================= 24 channel & wait_connect;25 26 30 struct ServerProc { 27 31 processor self; … … 84 88 // Run Server Cluster 85 89 { 86 cluster cl = { "Server Cluster", options.clopts. flags };90 cluster cl = { "Server Cluster", options.clopts.params }; 87 91 #if !defined(__CFA_NO_STATISTICS__) 88 92 print_stats_at_exit( cl, CFA_STATS_READY_Q | CFA_STATS_IO ); 89 93 #endif 90 94 options.clopts.instance = &cl; 91 92 channel chan = { options.clopts.chan_size };93 &wait_connect = &chan;94 95 95 96 int pipe_cnt = options.clopts.nworkers * 2; … … 102 103 } 103 104 105 if(options.file_cache.fixed_fds) { 106 register_fixed_files(cl, fds, pipe_off); 107 } 108 104 109 { 105 110 ServerProc procs[options.clopts.nprocs]; … … 107 112 Worker workers[options.clopts.nworkers]; 108 113 for(i; options.clopts.nworkers) { 109 if( options.file_cache.fixed_fds ) { 110 workers[i].pipe[0] = pipe_off + (i * 2) + 0; 111 workers[i].pipe[1] = pipe_off + (i * 2) + 1; 112 } 113 else { 114 // if( options.file_cache.fixed_fds ) { 115 // workers[i].pipe[0] = pipe_off + (i * 2) + 0; 116 // workers[i].pipe[1] = pipe_off + (i * 2) + 1; 117 // } 118 // else 119 { 114 120 workers[i].pipe[0] = fds[pipe_off + (i * 2) + 0]; 115 121 workers[i].pipe[1] = fds[pipe_off + (i * 2) + 1]; 122 workers[i].sockfd = server_fd; 123 workers[i].addr = (struct sockaddr *)&address; 124 workers[i].addrlen = (socklen_t*)&addrlen; 125 workers[i].flags = 0; 116 126 } 117 unpark( workers[i] __cfaabi_dbg_ctx2);127 unpark( workers[i] ); 118 128 } 119 129 printf("%d workers started on %d processors\n", options.clopts.nworkers, options.clopts.nprocs); 120 130 { 121 Acceptor acceptor = { server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen, 0 };122 123 131 char buffer[128]; 124 132 while(!feof(stdin)) { … … 127 135 128 136 printf("Shutting Down\n"); 129 }130 printf("Acceptor Closed\n");131 132 // Clean-up the workers133 for(options.clopts.nworkers) {134 put( wait_connect, -1 );135 137 } 136 138 } -
benchmark/io/http/options.cfa
rae2c27a rc76bd34 31 31 1, // nworkers; 32 32 0, // flags; 33 10, // chan_size;34 33 false, // procstats 35 34 false, // viewhalts … … 39 38 40 39 const char * parse_options( int argc, char * argv[] ) { 41 bool uthrdpo = false;42 40 bool subthrd = false; 43 41 bool eagrsub = false; … … 52 50 {'t', "threads", "Number of worker threads to use", options.clopts.nworkers}, 53 51 {'b', "accept-backlog", "Maximum number of pending accepts", options.socket.backlog}, 54 {'B', "channel-size", "Maximum number of accepted connection pending", options.clopts.chan_size},55 52 {'r', "request_len", "Maximum number of bytes in the http request, requests with more data will be answered with Http Code 414", options.socket.buflen}, 56 53 {'S', "seed", "seed to use for hashing", options.file_cache.hash_seed }, 57 54 {'C', "cache-size", "Size of the cache to use, if set to small, will uses closes power of 2", options.file_cache.size }, 58 55 {'l', "list-files", "List the files in the specified path and exit", options.file_cache.list, parse_settrue }, 59 {'u', "userthread", "If set, cluster uses user-thread to poll I/O", uthrdpo, parse_settrue },60 56 {'s', "submitthread", "If set, cluster uses polling thread to submit I/O", subthrd, parse_settrue }, 61 57 {'e', "eagersubmit", "If set, cluster submits I/O eagerly but still aggregates submits", eagrsub, parse_settrue}, … … 71 67 parse_args( argc, argv, opt, opt_cnt, "[OPTIONS]... [PATH]\ncforall http server", left ); 72 68 73 if( uthrdpo ) { 74 options.clopts.flags |= CFA_CLUSTER_IO_POLLER_USER_THREAD; 75 } 76 77 if( subthrd ) { 78 options.clopts.flags |= CFA_CLUSTER_IO_POLLER_THREAD_SUBMITS; 79 } 80 81 if( eagrsub ) { 82 options.clopts.flags |= CFA_CLUSTER_IO_EAGER_SUBMITS; 83 } 69 options.clopts.params.poller_submits = subthrd; 70 options.clopts.params.eager_submits = eagrsub; 84 71 85 72 if( fixedfd ) { … … 88 75 89 76 if( sqkpoll ) { 90 options.clopts. flags |= CFA_CLUSTER_IO_KERNEL_POLL_SUBMITS;77 options.clopts.params.poll_submit = true; 91 78 options.file_cache.fixed_fds = true; 92 79 } 93 80 94 81 if( iokpoll ) { 95 options.clopts. flags |= CFA_CLUSTER_IO_KERNEL_POLL_COMPLETES;82 options.clopts.params.poll_complete = true; 96 83 options.file_cache.open_flags |= O_DIRECT; 97 84 } 98 85 99 options.clopts. flags |= (sublen << CFA_CLUSTER_IO_BUFFLEN_OFFSET);86 options.clopts.params.num_ready = sublen; 100 87 101 88 if( left[0] == 0p ) { return "."; } -
benchmark/io/http/options.hfa
rae2c27a rc76bd34 2 2 3 3 #include <stdint.h> 4 5 #include <kernel.hfa> 4 6 5 7 struct cluster; … … 23 25 int nprocs; 24 26 int nworkers; 25 int flags; 26 int chan_size; 27 io_context_params params; 27 28 bool procstats; 28 29 bool viewhalts; -
benchmark/io/http/protocol.cfa
rae2c27a rc76bd34 11 11 extern "C" { 12 12 int snprintf ( char * s, size_t n, const char * format, ... ); 13 #include <linux/io_uring.h> 13 14 } 14 15 #include <string.h> 15 16 16 #include <errno.h> 17 17 18 #include "options.hfa" 18 19 19 20 const char * http_msgs[] = { … … 74 75 READ: 75 76 for() { 76 int ret = cfa_read(fd, it, count);77 if(ret == 0 ) return [OK200, true, 0 p, 0];77 int ret = cfa_read(fd, (void*)it, count, 0, -1`s, 0p, 0p); 78 if(ret == 0 ) return [OK200, true, 0, 0]; 78 79 if(ret < 0 ) { 79 80 if( errno == EAGAIN || errno == EWOULDBLOCK) continue READ; … … 88 89 count -= ret; 89 90 90 if( count < 1 ) return [E414, false, 0 p, 0];91 if( count < 1 ) return [E414, false, 0, 0]; 91 92 } 92 93 … … 95 96 it = buffer; 96 97 int ret = memcmp(it, "GET /", 5); 97 if( ret != 0 ) return [E400, false, 0 p, 0];98 if( ret != 0 ) return [E400, false, 0, 0]; 98 99 it += 5; 99 100 … … 106 107 ssize_t ret; 107 108 SPLICE1: while(count > 0) { 108 ret = cfa_splice(ans_fd, &offset, pipe[1], 0p, count, SPLICE_F_MOVE | SPLICE_F_MORE );109 ret = cfa_splice(ans_fd, &offset, pipe[1], 0p, count, SPLICE_F_MOVE | SPLICE_F_MORE, 0, -1`s, 0p, 0p); 109 110 if( ret < 0 ) { 110 111 if( errno != EAGAIN && errno != EWOULDBLOCK) continue SPLICE1; … … 116 117 size_t in_pipe = ret; 117 118 SPLICE2: while(in_pipe > 0) { 118 ret = cfa_splice(pipe[0], 0p, fd, 0p, in_pipe, SPLICE_F_MOVE | SPLICE_F_MORE );119 ret = cfa_splice(pipe[0], 0p, fd, 0p, in_pipe, SPLICE_F_MOVE | SPLICE_F_MORE, 0, -1`s, 0p, 0p); 119 120 if( ret < 0 ) { 120 121 if( errno != EAGAIN && errno != EWOULDBLOCK) continue SPLICE2; -
benchmark/io/http/worker.cfa
rae2c27a rc76bd34 22 22 23 23 void main( Worker & this ) { 24 park( __cfaabi_dbg_ctx);24 park(); 25 25 /* paranoid */ assert( this.pipe[0] != -1 ); 26 26 /* paranoid */ assert( this.pipe[1] != -1 ); … … 28 28 CONNECTION: 29 29 for() { 30 int fd = take(wait_connect); 31 if (fd < 0) break; 30 int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0, -1`s, 0p, 0p ); 31 if(fd < 0) { 32 if( errno == ECONNABORTED ) break; 33 abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) ); 34 } 32 35 33 36 printf("New connection %d, waiting for requests\n", fd); … … 82 85 } 83 86 } 84 85 //=============================================================================================86 // Acceptor Thread87 //=============================================================================================88 void ?{}( Acceptor & this, int sockfd, struct sockaddr * addr, socklen_t * addrlen, int flags ) {89 ((thread&)this){ "Acceptor Thread", *options.clopts.instance };90 this.sockfd = sockfd;91 this.addr = addr;92 this.addrlen = addrlen;93 this.flags = flags;94 }95 96 void main( Acceptor & this ) {97 for() {98 int ret = cfa_accept4( this.[sockfd, addr, addrlen, flags] );99 if(ret < 0) {100 if( errno == ECONNABORTED ) break;101 abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) );102 }103 104 printf("New connection accepted\n");105 put( wait_connect, ret );106 }107 } -
benchmark/io/http/worker.hfa
rae2c27a rc76bd34 7 7 } 8 8 9 #include "channel.hfa"10 11 extern channel & wait_connect;12 13 9 //============================================================================================= 14 10 // Worker Thread … … 17 13 thread Worker { 18 14 int pipe[2]; 19 };20 void ?{}( Worker & this );21 void main( Worker & );22 23 //=============================================================================================24 // Acceptor Thread25 //=============================================================================================26 thread Acceptor {27 15 int sockfd; 28 16 struct sockaddr * addr; … … 30 18 int flags; 31 19 }; 32 33 void ?{}( Acceptor & this, int sockfd, struct sockaddr * addr, socklen_t * addrlen, int flags ); 34 void main( Acceptor & this ); 20 void ?{}( Worker & this); 21 void main( Worker & ); -
benchmark/io/readv.cfa
rae2c27a rc76bd34 54 54 55 55 void main( Reader & ) { 56 park( __cfaabi_dbg_ctx);56 park(); 57 57 /* paranoid */ assert( true == __atomic_load_n(&run, __ATOMIC_RELAXED) ); 58 58 … … 151 151 152 152 for(i; nthreads) { 153 unpark( threads[i] __cfaabi_dbg_ctx2);153 unpark( threads[i] ); 154 154 } 155 155 wait(duration, start, end, is_tty); -
benchmark/mutex/JavaThread.java
rae2c27a rc76bd34 1 1 public class JavaThread { 2 2 // Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator. 3 // Bijective 3 // Bijective 4 4 // Cycle length for non-zero values is 4G-1. 5 5 // 0 is absorbing and should be avoided -- fixed point. 6 6 // The returned value is typically masked to produce a positive value. 7 static volatile int Ticket = 0 ; 7 static volatile int Ticket = 0 ; 8 8 9 9 private static int nextRandom (int x) { 10 if (x == 0) { 10 if (x == 0) { 11 11 // reseed the PRNG 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 20 20 } 21 21 x ^= x << 6; 22 22 x ^= x >>> 21; 23 23 x ^= x << 7; 24 return x ; 24 return x ; 25 25 } 26 26 static int x = 2; 27 27 28 static private int times = Integer.parseInt("100000000");28 static private long times = Long.parseLong("100000000"); 29 29 30 30 public synchronized void noop() { … … 34 34 JavaThread j = new JavaThread(); 35 35 // Inhibit biased locking ... 36 x = (j.hashCode() ^ System.identityHashCode(j)) | 1 ; 37 for( inti = 1; i <= times; i += 1) {36 x = (j.hashCode() ^ System.identityHashCode(j)) | 1 ; 37 for(long i = 1; i <= times; i += 1) { 38 38 x = nextRandom(x); 39 39 j.noop(); … … 47 47 } 48 48 public static void main(String[] args) throws InterruptedException { 49 if ( args.length > 2) System.exit( 1 );50 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }49 if ( args.length > 1 ) System.exit( 1 ); 50 if ( args.length == 1 ) { times = Long.parseLong(args[0]); } 51 51 52 for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 52 for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 53 53 InnerMain(); 54 54 Thread.sleep(2000); // 2 seconds -
benchmark/mutexC/JavaThread.java
rae2c27a rc76bd34 1 1 class Noop { 2 2 // Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator. 3 // Bijective 3 // Bijective 4 4 // Cycle length for non-zero values is 4G-1. 5 5 // 0 is absorbing and should be avoided -- fixed point. 6 6 // The returned value is typically masked to produce a positive value. 7 static volatile int Ticket = 0 ; 7 static volatile int Ticket = 0 ; 8 8 9 9 public static int nextRandom( int x ) { 10 if (x == 0) { 10 if (x == 0) { 11 11 // reseed the PRNG 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 12 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 13 // Note that we use a non-atomic racy increment -- the race is rare and benign. 14 // If the race is a concern switch to an AtomicInteger. 15 // In addition accesses to the RW volatile global "Ticket" variable are not 16 // (readily) predictable at compile-time so the JIT will not be able to elide 17 // nextRandom() invocations. 18 x = ++Ticket ; 19 if (x == 0) x = 1 ; 20 20 } 21 21 x ^= x << 6; 22 22 x ^= x >>> 21; 23 23 x ^= x << 7; 24 return x ; 24 return x ; 25 25 } 26 26 } … … 47 47 static int x = 2; 48 48 49 static private int times = Integer.parseInt("10000000");49 static private long times = Long.parseLong("10000000"); 50 50 51 51 public static void call( Monitor m ) throws InterruptedException { … … 53 53 m.go = true; 54 54 //while ( ! m.go2 ); 55 for ( inti = 0; i < times; i += 1 ) {55 for ( long i = 0; i < times; i += 1 ) { 56 56 m.call(); 57 57 x = Noop.nextRandom( x ); … … 71 71 public static void main( String[] args ) throws InterruptedException { 72 72 if ( args.length > 2 ) System.exit( 1 ); 73 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }73 if ( args.length == 2 ) { times = Long.parseLong(args[1]); } 74 74 75 if ( args.length > 2 ) System.exit( 1 ); 76 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); } 77 78 for ( int i = Integer.parseInt("5"); --i >= 0 ; ) { 75 for ( int i = Integer.parseInt("5"); --i >= 0 ; ) { 79 76 InnerMain(); 80 77 // Thread.sleep(2000); // 2 seconds -
benchmark/readyQ/yield.cfa
rae2c27a rc76bd34 32 32 33 33 void main( Yielder & this ) { 34 park( __cfaabi_dbg_ctx);34 park(); 35 35 /* paranoid */ assert( true == __atomic_load_n(&run, __ATOMIC_RELAXED) ); 36 36 … … 70 70 71 71 for(i; nthreads) { 72 unpark( threads[i] __cfaabi_dbg_ctx2);72 unpark( threads[i] ); 73 73 } 74 74 wait(duration, start, end, is_tty); -
benchmark/schedint/JavaThread.java
rae2c27a rc76bd34 24 24 public class JavaThread { 25 25 // Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator. 26 // Bijective 26 // Bijective 27 27 // Cycle length for non-zero values is 4G-1. 28 28 // 0 is absorbing and should be avoided -- fixed point. 29 29 // The returned value is typically masked to produce a positive value. 30 static volatile int Ticket = 0 ; 30 static volatile int Ticket = 0 ; 31 31 32 32 private static int nextRandom (int x) { 33 if (x == 0) { 33 if (x == 0) { 34 34 // reseed the PRNG 35 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 36 // Note that we use a non-atomic racy increment -- the race is rare and benign. 37 // If the race is a concern switch to an AtomicInteger. 38 // In addition accesses to the RW volatile global "Ticket" variable are not 39 // (readily) predictable at compile-time so the JIT will not be able to elide 40 // nextRandom() invocations. 41 x = ++Ticket ; 42 if (x == 0) x = 1 ; 35 // Ticket is accessed infrequently and does not constitute a coherence hot-spot. 36 // Note that we use a non-atomic racy increment -- the race is rare and benign. 37 // If the race is a concern switch to an AtomicInteger. 38 // In addition accesses to the RW volatile global "Ticket" variable are not 39 // (readily) predictable at compile-time so the JIT will not be able to elide 40 // nextRandom() invocations. 41 x = ++Ticket ; 42 if (x == 0) x = 1 ; 43 43 } 44 44 x ^= x << 6; 45 45 x ^= x >>> 21; 46 46 x ^= x << 7; 47 return x ; 47 return x ; 48 48 } 49 49 static int x = 2; 50 50 51 static private int times = Integer.parseInt("1000000");51 static private long times = Long.parseLong("1000000"); 52 52 53 53 public static void helper( Monitor m ) throws InterruptedException { 54 for( inti = 1; i <= times; i += 1) {54 for(long i = 1; i <= times; i += 1) { 55 55 m.wait(); // relase monitor lock 56 56 m.next = true; … … 75 75 } 76 76 public static void main(String[] args) throws InterruptedException { 77 if ( args.length > 2) System.exit( 1 );78 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }77 if ( args.length > 1 ) System.exit( 1 ); 78 if ( args.length == 1 ) { times = Long.parseLong(args[0]); } 79 79 80 for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 80 for (int n = Integer.parseInt("5"); --n >= 0 ; ) { 81 81 InnerMain(); 82 82 Thread.sleep(2000); // 2 seconds
Note:
See TracChangeset
for help on using the changeset viewer.