source: doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa @ b9f6a7cd

Last change on this file since b9f6a7cd was b5e3a80, checked in by caparson <caparson@…>, 18 months ago

refactored waituntil future benchmarks and updated runscript

  • Property mode set to 100644
File size: 3.7 KB
Line 
1#include <select.hfa>
2#include <thread.hfa>
3#include <future.hfa>
4#include <fstream.hfa>
5#include <stdio.h>
6#include <time.hfa>
7#include <string.h>
8
9// #define ANDOR
10
11size_t Processors = 2, Time = 10;
12
13size_t globalTotal = 0;
14future(size_t) A, B, C;
15volatile bool done_loop = false;
16volatile bool client_done = false;
17volatile bool server_done = false;
18
19static 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
49static 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
129thread Client {};
130void main( Client & this ) {
131    size_t i = 0;
132    for(; !client_done; i++ ) {
133        wait();
134        reset( A );
135        reset( B );
136        reset( C );
137        done_loop = true;
138    }
139    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
140}
141
142thread Server {};
143void main( Server & this ) {
144    for( size_t i = 0; !server_done; i++ ) {
145        fulfill( i );
146        while( !done_loop ) {}
147        done_loop = false;
148    }
149}
150
151int main( int argc, char * argv[] ) {
152    switch ( argc ) {
153          case 2:
154                if ( strcmp( argv[1], "d" ) != 0 ) {                    // default ?
155                        Time = atoi( argv[1] );
156                        if ( Time < 0 ) goto Usage;
157                } // if
158          case 1:                                                                                       // use defaults
159                break;
160          default:
161          Usage:
162                sout | "Usage: " | argv[0]
163             | "[ time (>= 0) | 'd' (default " | Time
164                         | ") ]" ;
165                exit( EXIT_FAILURE );
166        } // switch
167    processor p[Processors - 1];
168
169    {
170        Server s;
171        {
172            Client c;
173
174            sleep(Time`s);
175
176            client_done = true;
177        }
178        server_done = true;
179        done_loop = true;
180    }
181    printf("%zu\n", globalTotal);
182}
Note: See TracBrowser for help on using the repository browser.