Changes in / [b7b3e41:33d4bc8]
- Location:
- doc/theses/colby_parsons_MMAth/benchmarks/waituntil
- Files:
-
- 4 edited
-
cfa/future.cfa (modified) (4 diffs)
-
cfa/sidechan.cfa (modified) (2 diffs)
-
run (modified) (5 diffs)
-
ucpp/future.cc (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa
rb7b3e41 r33d4bc8 7 7 #include <string.h> 8 8 9 // #define ANDOR 10 11 size_t Processors = 2, Time = 10; 9 size_t Clients = 1, Time = 10; 12 10 13 11 size_t globalTotal = 0; 14 12 future(size_t) A, B, C; 15 volatile bool done_loop = false; 13 volatile bool server_done_loop = false; 14 volatile bool client_done_loop = false; 16 15 volatile bool client_done = false; 17 16 volatile bool server_done = false; 18 17 19 static inline void wait() { 20 #ifdef OR 21 waituntil( A ) { get( A ); } 22 or waituntil( B ) { get( B ); } 23 or waituntil( C ) { get( C ); } 24 #endif 25 #ifdef AND 26 waituntil( A ) { get( A ); } 27 and waituntil( B ) { get( B ); } 28 #endif 29 #ifdef AND3 30 waituntil( A ) { get( A ); } 31 and waituntil( B ) { get( B ); } 32 and waituntil( C ) { get( C ); } 33 #endif 34 #ifdef ANDOR 35 waituntil( A ) { get( A ); } 36 and waituntil( B ) { get( B ); } 37 or waituntil( C ) { get( C ); } 38 #endif 39 #ifdef ORAND 40 (waituntil( A ) { get( A ); } 41 or waituntil( B ) { get( B ); }) 42 and waituntil( C ) { get( C ); } 43 #endif 44 #ifdef BASIC 45 get( A ); 46 #endif 47 } 48 49 static inline fulfill( size_t i ) { 50 #ifdef OR 51 if ( i % 3 == 0 ) { 52 fulfil(A, i); 53 } else if ( i % 3 == 1 ) { 54 fulfil(B, i); 55 } else { 56 fulfil(C, i); 57 } 58 #endif 59 #ifdef AND 60 if ( i % 2 == 0 ) { 61 fulfil(A, i); 62 fulfil(B, i); 63 } else { 64 fulfil(B, i); 65 fulfil(A, i); 66 } 67 #endif 68 #ifdef AND3 69 if ( i % 6 == 0 ) { 70 fulfil(A, i); 71 fulfil(B, i); 72 fulfil(C, i); 73 } else if ( i % 6 == 1 ) { 74 fulfil(A, i); 75 fulfil(C, i); 76 fulfil(B, i); 77 } else if ( i % 6 == 2 ) { 78 fulfil(B, i); 79 fulfil(A, i); 80 fulfil(C, i); 81 } else if ( i % 6 == 3 ) { 82 fulfil(B, i); 83 fulfil(C, i); 84 fulfil(A, i); 85 } else if ( i % 6 == 4 ) { 86 fulfil(C, i); 87 fulfil(A, i); 88 fulfil(B, i); 89 } else if ( i % 6 == 5 ) { 90 fulfil(C, i); 91 fulfil(B, i); 92 fulfil(A, i); 93 } 94 #endif 95 #ifdef ANDOR 96 if ( i % 4 == 0 ) { 97 fulfil(A, i); 98 fulfil(B, i); 99 } else if ( i % 4 == 1 ) { 100 fulfil(A, i); 101 fulfil(C, i); 102 } else if ( i % 4 == 2 ) { 103 fulfil(B, i); 104 fulfil(C, i); 105 } else { 106 fulfil(C, i); 107 } 108 #endif 109 #ifdef ORAND 110 if ( i % 4 == 0 ) { 111 fulfil(A, i); 112 fulfil(C, i); 113 } else if ( i % 4 == 1 ) { 114 fulfil(C, i); 115 fulfil(A, i); 116 } else if ( i % 4 == 2 ) { 117 fulfil(B, i); 118 fulfil(C, i); 119 } else { 120 fulfil(C, i); 121 fulfil(B, i); 122 } 123 #endif 124 #ifdef BASIC 125 fulfil(A, i); 126 #endif 127 } 128 18 volatile size_t client_count = 0; 19 volatile size_t client_loop_count = 0; 129 20 thread Client {}; 130 21 void main( Client & this ) { 131 22 size_t i = 0; 132 for(; !client_done; i++ ) { 133 wait(); 134 reset( A ); 135 reset( B ); 136 reset( C ); 137 done_loop = true; 23 for(;; i++ ) { 24 waituntil( A ) { get(A); } 25 and waituntil( B ) { get(B); } 26 or waituntil( C ) { get(C); } 27 28 // needs to check after waituntil for termination synchronization 29 if ( client_done ) break; 30 31 // Barrier-like synch needed to reset futures safely 32 if ( __atomic_add_fetch( &client_count, 1, __ATOMIC_SEQ_CST ) == Clients ) { // synchronize reset 33 client_count = 0; 34 reset( A ); 35 reset( B ); 36 reset( C ); 37 client_done_loop = true; // unblock clients 38 } 39 while( !client_done_loop ) {} // client barrier 40 if ( __atomic_add_fetch( &client_loop_count, 1, __ATOMIC_SEQ_CST ) == Clients ) { 41 client_done_loop = false; // reset barrier before clients can proceed past waituntil 42 server_done_loop = true; // unblock server to restart iteration 43 client_loop_count = 0; 44 } 138 45 } 139 46 __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST ); … … 143 50 void main( Server & this ) { 144 51 for( size_t i = 0; !server_done; i++ ) { 145 fulfill( i ); 146 while( !done_loop ) {} 147 done_loop = false; 52 if ( i % 4 == 0 ) { 53 fulfil(A, i); 54 fulfil(B, i); 55 } else if ( i % 4 == 1 ) { 56 fulfil(A, i); 57 fulfil(C, i); 58 } else if ( i % 4 == 2 ) { 59 fulfil(B, i); 60 fulfil(C, i); 61 } else { 62 fulfil(C, i); 63 } 64 while( !server_done_loop && !server_done ) {} // server barrier 65 server_done_loop = false; // reset server barrier 148 66 } 149 67 } … … 151 69 int main( int argc, char * argv[] ) { 152 70 switch ( argc ) { 71 case 3: 72 if ( strcmp( argv[2], "d" ) != 0 ) { // default ? 73 Time = atoi( argv[2] ); 74 } // if 153 75 case 2: 154 76 if ( strcmp( argv[1], "d" ) != 0 ) { // default ? 155 Time= atoi( argv[1] );156 if ( Time < 0) goto Usage;77 Clients = atoi( argv[1] ); 78 if ( Clients < 1 ) goto Usage; 157 79 } // if 158 80 case 1: // use defaults … … 161 83 Usage: 162 84 sout | "Usage: " | argv[0] 163 | "[ time (>= 0) | 'd' (default " | Time 85 | " [ clients (> 0) | 'd' (default " | Clients 86 | ") ] [ time (>= 0) | 'd' (default " | Time 164 87 | ") ]" ; 165 88 exit( EXIT_FAILURE ); 166 89 } // switch 167 processor p[ Processors - 1];90 processor p[Clients]; 168 91 169 92 { 170 Server s;93 Client c[Clients]; 171 94 { 172 Client c;95 Server s; 173 96 174 97 sleep(Time`s); 175 176 client_done = true; 98 server_done = true; 177 99 } 178 server_done = true; 179 done_loop = true; 100 while( available(A) || available(B) || available(C) ) {} 101 client_done = true; 102 fulfil( C, 0 ); 180 103 } 181 104 printf("%zu\n", globalTotal); -
doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/sidechan.cfa
rb7b3e41 r33d4bc8 37 37 thread Consumer {}; 38 38 void main( Consumer & this ) { 39 constint idx = __atomic_fetch_add( &cons_counter, 1, __ATOMIC_SEQ_CST ) % Channels;39 int idx = __atomic_fetch_add( &cons_counter, 1, __ATOMIC_SEQ_CST ) % Channels; 40 40 size_t val, i = 0; 41 41 try { … … 49 49 thread Producer {}; 50 50 void main( Producer & this ) { 51 constint idx = __atomic_fetch_add( &prod_counter, 1, __ATOMIC_SEQ_CST ) % Channels;51 int idx = __atomic_fetch_add( &prod_counter, 1, __ATOMIC_SEQ_CST ) % Channels; 52 52 try { 53 53 for( size_t i = 0;; i++ ) { -
doc/theses/colby_parsons_MMAth/benchmarks/waituntil/run
rb7b3e41 r33d4bc8 85 85 } 86 86 87 numtimes=3 88 #numtimes=187 # numtimes=5 88 numtimes=1 89 89 90 90 # num_threads='2 4 8 16 24 32' 91 side_chan_threads='6 12 18 24 30' # must be mults of 691 # side_chan_threads='6 12 18 24 30' # must be mults of 6 92 92 num_threads='2' 93 #side_chan_threads='6'93 side_chan_threads='6' 94 94 95 95 chan_size='10' 96 96 future_time='10' 97 future_flags=('-DOR' '-DAND3' '-DANDOR' '-DORAND')98 future_names=('OR' 'AND' 'ANDOR' 'ORAND')99 97 100 98 # toggle benchmarks … … 105 103 spin=${false} 106 104 contend=${false} 107 #sidechan=${false}108 future=${false}105 sidechan=${false} 106 # future=${false} 109 107 110 108 runCFA=${true} … … 166 164 167 165 run_future() { 168 affinity 2 169 preprint="2\t" 170 repeat_command taskset -c ${taskset} ./a.${hostname} ${post_args} 166 for p in ${num_threads} ; do 167 pre_args=$(( ${p} - 1 )) 168 affinity ${p} 169 preprint="${p}\t" 170 repeat_command taskset -c ${taskset} ./a.${hostname} ${pre_args} ${post_args} 171 done 171 172 } 172 173 … … 246 247 ${cfa} ${cfa_flags} sidechan.cfa -o a.${hostname} > /dev/null 2>&1 247 248 run_side_chan 248 #rm a.${hostname}249 rm a.${hostname} 249 250 cd - > /dev/null 250 251 fi # done CFA … … 261 262 262 263 if [ ${future} -eq ${true} ] ; then 264 echo "future: " 263 265 post_args=${future_time} 264 for i in ${!future_flags[@]}; do 265 echo 'future '${future_names[$i]}':' 266 if [ ${runCFA} -eq ${true} ] ; then 267 cd cfa # CFA RUN 268 print_header 'CFA' 269 ${cfa} ${cfa_flags} ${future_flags[$i]} future.cfa -o a.${hostname} > /dev/null 2>&1 270 run_future 271 rm a.${hostname} 272 cd - > /dev/null 273 fi # done CFA 274 275 if [ ${runUCPP} -eq ${true} ] ; then 276 cd ucpp 277 print_header 'uC++' 278 ${UCPP} ${UCPPflags} ${future_flags[$i]} future.cc -o a.${hostname} > /dev/null 2>&1 279 run_future 280 rm a.${hostname} 281 cd - > /dev/null 282 fi # done Go 283 done 284 fi 285 266 if [ ${runCFA} -eq ${true} ] ; then 267 cd cfa # CFA RUN 268 print_header 'CFA' 269 ${cfa} ${cfa_flags} future.cfa -o a.${hostname} > /dev/null 2>&1 270 run_future 271 rm a.${hostname} 272 cd - > /dev/null 273 fi # done CFA 274 275 if [ ${runUCPP} -eq ${true} ] ; then 276 cd ucpp 277 print_header 'uC++' 278 ${UCPP} ${UCPPflags} future.cc -o a.${hostname} > /dev/null 2>&1 279 run_future 280 rm a.${hostname} 281 cd - > /dev/null 282 fi # done Go 283 fi 284 -
doc/theses/colby_parsons_MMAth/benchmarks/waituntil/ucpp/future.cc
rb7b3e41 r33d4bc8 3 3 #include <uFuture.h> 4 4 5 // #define ANDOR 5 size_t Clients = 2, Time = 10; 6 6 7 size_t Processors = 2, Time = 10;8 7 size_t globalTotal = 0; 9 volatile bool done_loop = false; 8 Future_ISM<size_t> A, B, C; 9 volatile bool server_done_loop = false; 10 volatile bool client_done_loop = false; 10 11 volatile bool client_done = false; 11 12 volatile bool server_done = false; 12 13 13 Future_ISM<size_t> A, B, C; 14 15 static inline void wait() { 16 #ifdef OR 17 _Select( A ) { A(); } 18 or _Select( B ) { B(); } 19 or _Select( C ) { C(); } 20 #endif 21 #ifdef AND 22 _Select( A ) { A(); } 23 and _Select( B ) { B(); } 24 #endif 25 #ifdef AND3 26 _Select( A ) { A(); } 27 and _Select( B ) { B(); } 28 and _Select( C ) { C(); } 29 #endif 30 #ifdef ANDOR 31 _Select( A ) { A(); } 32 and _Select( B ) { B(); } 33 or _Select( C ) { C(); } 34 #endif 35 #ifdef ORAND 36 (_Select( A ) { A(); } 37 or _Select( B ) { B(); }) 38 and _Select( C ) { C(); } 39 #endif 40 #ifdef BASIC 41 A(); 42 #endif 43 } 44 45 static inline void fulfill( size_t i ) { 46 #ifdef OR 47 if ( i % 3 == 0 ) { 48 A.delivery(i); 49 } else if ( i % 3 == 1 ) { 50 B.delivery(i); 51 } else { 52 C.delivery(i); 53 } 54 #endif 55 #ifdef AND 56 if ( i % 2 == 0 ) { 57 A.delivery(i); 58 B.delivery(i); 59 } else { 60 B.delivery(i); 61 A.delivery(i); 62 } 63 #endif 64 #ifdef AND3 65 if ( i % 6 == 0 ) { 66 A.delivery(i); 67 B.delivery(i); 68 C.delivery(i); 69 } else if ( i % 6 == 1 ) { 70 A.delivery(i); 71 C.delivery(i); 72 B.delivery(i); 73 } else if ( i % 6 == 2 ) { 74 B.delivery(i); 75 A.delivery(i); 76 C.delivery(i); 77 } else if ( i % 6 == 3 ) { 78 B.delivery(i); 79 C.delivery(i); 80 A.delivery(i); 81 } else if ( i % 6 == 4 ) { 82 C.delivery(i); 83 A.delivery(i); 84 B.delivery(i); 85 } else if ( i % 6 == 5 ) { 86 C.delivery(i); 87 B.delivery(i); 88 A.delivery(i); 89 } 90 #endif 91 #ifdef ANDOR 92 if ( i % 4 == 0 ) { 93 A.delivery(i); 94 B.delivery(i); 95 } else if ( i % 4 == 1 ) { 96 A.delivery(i); 97 C.delivery(i); 98 } else if ( i % 4 == 2 ) { 99 B.delivery(i); 100 C.delivery(i); 101 } else { 102 C.delivery(i); 103 } 104 #endif 105 #ifdef ORAND 106 if ( i % 4 == 0 ) { 107 A.delivery(i); 108 C.delivery(i); 109 } else if ( i % 4 == 1 ) { 110 C.delivery(i); 111 A.delivery(i); 112 } else if ( i % 4 == 2 ) { 113 B.delivery(i); 114 C.delivery(i); 115 } else { 116 C.delivery(i); 117 B.delivery(i); 118 } 119 #endif 120 #ifdef BASIC 121 A.delivery(i); 122 #endif 123 } 124 14 volatile size_t client_count = 0; 15 volatile size_t client_loop_count = 0; 125 16 _Task Client { 126 17 void main() { 127 18 size_t i = 0; 128 for(; !client_done; i++ ) { 129 wait(); 130 A.reset(); 131 B.reset(); 132 C.reset(); 133 done_loop = true; 19 for(;; i++ ) { 20 _Select( A ) { A(); } 21 and _Select( B ) { B(); } 22 or _Select( C ) { C(); } 23 24 // needs to check after waituntil for termination synchronization 25 if ( client_done ) break; 26 27 // Barrier-like synch needed to reset futures safely 28 if ( __atomic_add_fetch(&client_count, 1, __ATOMIC_SEQ_CST) == Clients ) { 29 client_count = 0; 30 A.reset(); 31 B.reset(); 32 C.reset(); 33 client_done_loop = true; 34 } 35 while( !client_done_loop ) {} // client barrier 36 if ( __atomic_add_fetch( &client_loop_count, 1, __ATOMIC_SEQ_CST ) == Clients ) { 37 client_done_loop = false; // reset barrier before clients can proceed past waituntil 38 server_done_loop = true; // unblock server to restart iteration 39 client_loop_count = 0; 40 } 134 41 } 135 42 __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST ); … … 140 47 void main() { 141 48 for( size_t i = 0; !server_done; i++ ) { 142 fulfill( i ); 143 while( !done_loop ) {} 144 done_loop = false; 49 if ( i % 4 == 0 ) { 50 A.delivery(i); 51 B.delivery(i); 52 } else if ( i % 4 == 1 ) { 53 A.delivery(i); 54 C.delivery(i); 55 } else if ( i % 4 == 2 ) { 56 B.delivery(i); 57 C.delivery(i); 58 } else { 59 C.delivery(i); 60 } 61 while( !server_done_loop && !server_done ) {} // server barrier 62 server_done_loop = false; // reset server barrier 145 63 } 146 64 } … … 149 67 int main( int argc, char * argv[] ) { 150 68 switch ( argc ) { 69 case 3: 70 if ( strcmp( argv[2], "d" ) != 0 ) { // default ? 71 Time = atoi( argv[2] ); 72 } // if 151 73 case 2: 152 74 if ( strcmp( argv[1], "d" ) != 0 ) { // default ? 153 Time= atoi( argv[1] );154 if ( Time < 0) goto Usage;75 Clients = atoi( argv[1] ); 76 if ( Clients < 1 ) goto Usage; 155 77 } // if 156 78 case 1: // use defaults … … 159 81 Usage: 160 82 cerr << "Usage: " << argv[0] 161 << "[ time (>= 0) | 'd' (default " << Time 83 << " [ clients (> 0) | 'd' (default " << Clients 84 << ") ] [ time (>= 0) | 'd' (default " << Time 162 85 << ") ]" ; 163 86 exit( EXIT_FAILURE ); 164 87 } // switch 165 uProcessor p[ Processors - 1];88 uProcessor p[Clients]; 166 89 167 90 { 168 Server s;91 Client c[Clients]; 169 92 { 170 Client c;93 Server s; 171 94 172 95 uBaseTask::sleep( uDuration( Time ) ); 173 96 174 client_done = true;97 server_done = true; 175 98 } 176 server_done = true; 177 done_loop = true; 99 while( A.available() || B.available() || C.available() ) {} 100 client_done = true; 101 C.delivery(1); // can't deliver 0 since it causes ambiguity 178 102 } 179 103 cout << globalTotal << endl;
Note:
See TracChangeset
for help on using the changeset viewer.