Changeset b5e3a80 for doc/theses/colby_parsons_MMAth/benchmarks
- Timestamp:
- Jun 7, 2023, 1:34:08 PM (21 months ago)
- Branches:
- master
- Children:
- fa5e1aa5
- Parents:
- ded6c2a6
- Location:
- doc/theses/colby_parsons_MMAth/benchmarks/waituntil
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa ¶
rded6c2a6 rb5e3a80 7 7 #include <string.h> 8 8 9 size_t Clients = 1, Time = 10; 9 // #define ANDOR 10 11 size_t Processors = 2, Time = 10; 10 12 11 13 size_t globalTotal = 0; 12 14 future(size_t) A, B, C; 13 volatile bool server_done_loop = false; 14 volatile bool client_done_loop = false; 15 volatile bool done_loop = false; 15 16 volatile bool client_done = false; 16 17 volatile bool server_done = false; 17 18 18 volatile size_t client_count = 0; 19 volatile size_t client_loop_count = 0; 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 20 129 thread Client {}; 21 130 void main( Client & this ) { 22 131 size_t i = 0; 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 } 132 for(; !client_done; i++ ) { 133 wait(); 134 reset( A ); 135 reset( B ); 136 reset( C ); 137 done_loop = true; 45 138 } 46 139 __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST ); … … 50 143 void main( Server & this ) { 51 144 for( size_t i = 0; !server_done; i++ ) { 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 145 fulfill( i ); 146 while( !done_loop ) {} 147 done_loop = false; 66 148 } 67 149 } … … 69 151 int main( int argc, char * argv[] ) { 70 152 switch ( argc ) { 71 case 3:72 if ( strcmp( argv[2], "d" ) != 0 ) { // default ?73 Time = atoi( argv[2] );74 } // if75 153 case 2: 76 154 if ( strcmp( argv[1], "d" ) != 0 ) { // default ? 77 Clients= atoi( argv[1] );78 if ( Clients < 1) goto Usage;155 Time = atoi( argv[1] ); 156 if ( Time < 0 ) goto Usage; 79 157 } // if 80 158 case 1: // use defaults … … 83 161 Usage: 84 162 sout | "Usage: " | argv[0] 85 | " [ clients (> 0) | 'd' (default " | Clients 86 | ") ] [ time (>= 0) | 'd' (default " | Time 163 | "[ time (>= 0) | 'd' (default " | Time 87 164 | ") ]" ; 88 165 exit( EXIT_FAILURE ); 89 166 } // switch 90 processor p[ Clients];167 processor p[Processors - 1]; 91 168 92 169 { 93 Client c[Clients];170 Server s; 94 171 { 95 Server s;172 Client c; 96 173 97 174 sleep(Time`s); 98 server_done = true; 175 176 client_done = true; 99 177 } 100 while( available(A) || available(B) || available(C) ) {} 101 client_done = true; 102 fulfil( C, 0 ); 178 server_done = true; 179 done_loop = true; 103 180 } 104 181 printf("%zu\n", globalTotal); -
TabularUnified doc/theses/colby_parsons_MMAth/benchmarks/waituntil/run ¶
rded6c2a6 rb5e3a80 85 85 } 86 86 87 # numtimes=5 88 numtimes=187 numtimes=3 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') 97 99 98 100 # toggle benchmarks … … 103 105 spin=${false} 104 106 contend=${false} 105 sidechan=${false}106 #future=${false}107 # sidechan=${false} 108 future=${false} 107 109 108 110 runCFA=${true} … … 164 166 165 167 run_future() { 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 168 affinity 2 169 preprint="2\t" 170 repeat_command taskset -c ${taskset} ./a.${hostname} ${post_args} 172 171 } 173 172 … … 247 246 ${cfa} ${cfa_flags} sidechan.cfa -o a.${hostname} > /dev/null 2>&1 248 247 run_side_chan 249 rm a.${hostname}248 # rm a.${hostname} 250 249 cd - > /dev/null 251 250 fi # done CFA … … 262 261 263 262 if [ ${future} -eq ${true} ] ; then 264 echo "future: "265 263 post_args=${future_time} 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 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 -
TabularUnified doc/theses/colby_parsons_MMAth/benchmarks/waituntil/ucpp/future.cc ¶
rded6c2a6 rb5e3a80 3 3 #include <uFuture.h> 4 4 5 size_t Clients = 2, Time = 10; 5 // #define ANDOR 6 6 7 size_t Processors = 2, Time = 10; 7 8 size_t globalTotal = 0; 8 Future_ISM<size_t> A, B, C; 9 volatile bool server_done_loop = false; 10 volatile bool client_done_loop = false; 9 volatile bool done_loop = false; 11 10 volatile bool client_done = false; 12 11 volatile bool server_done = false; 13 12 14 volatile size_t client_count = 0; 15 volatile size_t client_loop_count = 0; 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 16 125 _Task Client { 17 126 void main() { 18 127 size_t i = 0; 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 } 128 for(; !client_done; i++ ) { 129 wait(); 130 A.reset(); 131 B.reset(); 132 C.reset(); 133 done_loop = true; 41 134 } 42 135 __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST ); … … 47 140 void main() { 48 141 for( size_t i = 0; !server_done; i++ ) { 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 142 fulfill( i ); 143 while( !done_loop ) {} 144 done_loop = false; 63 145 } 64 146 } … … 67 149 int main( int argc, char * argv[] ) { 68 150 switch ( argc ) { 69 case 3:70 if ( strcmp( argv[2], "d" ) != 0 ) { // default ?71 Time = atoi( argv[2] );72 } // if73 151 case 2: 74 152 if ( strcmp( argv[1], "d" ) != 0 ) { // default ? 75 Clients= atoi( argv[1] );76 if ( Clients < 1) goto Usage;153 Time = atoi( argv[1] ); 154 if ( Time < 0 ) goto Usage; 77 155 } // if 78 156 case 1: // use defaults … … 81 159 Usage: 82 160 cerr << "Usage: " << argv[0] 83 << " [ clients (> 0) | 'd' (default " << Clients 84 << ") ] [ time (>= 0) | 'd' (default " << Time 161 << "[ time (>= 0) | 'd' (default " << Time 85 162 << ") ]" ; 86 163 exit( EXIT_FAILURE ); 87 164 } // switch 88 uProcessor p[ Clients];165 uProcessor p[Processors - 1]; 89 166 90 167 { 91 Client c[Clients];168 Server s; 92 169 { 93 Server s;170 Client c; 94 171 95 172 uBaseTask::sleep( uDuration( Time ) ); 96 173 97 server_done = true;174 client_done = true; 98 175 } 99 while( A.available() || B.available() || C.available() ) {} 100 client_done = true; 101 C.delivery(1); // can't deliver 0 since it causes ambiguity 176 server_done = true; 177 done_loop = true; 102 178 } 103 179 cout << globalTotal << endl;
Note: See TracChangeset
for help on using the changeset viewer.