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

Last change on this file was b5e3a80, checked in by caparson <caparson@…>, 2 years ago

refactored waituntil future benchmarks and updated runscript

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