- Timestamp:
- Jun 7, 2023, 1:34:08 PM (16 months ago)
- Branches:
- master
- Children:
- fa5e1aa5
- Parents:
- ded6c2a6
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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);
Note: See TracChangeset
for help on using the changeset viewer.