Ignore:
Timestamp:
Jun 7, 2023, 1:34:08 PM (16 months ago)
Author:
caparson <caparson@…>
Branches:
master
Children:
fa5e1aa5
Parents:
ded6c2a6
Message:

refactored waituntil future benchmarks and updated runscript

File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/colby_parsons_MMAth/benchmarks/waituntil/cfa/future.cfa

    rded6c2a6 rb5e3a80  
    77#include <string.h>
    88
    9 size_t Clients = 1, Time = 10;
     9// #define ANDOR
     10
     11size_t Processors = 2, Time = 10;
    1012
    1113size_t globalTotal = 0;
    1214future(size_t) A, B, C;
    13 volatile bool server_done_loop = false;
    14 volatile bool client_done_loop = false;
     15volatile bool done_loop = false;
    1516volatile bool client_done = false;
    1617volatile bool server_done = false;
    1718
    18 volatile size_t client_count = 0;
    19 volatile size_t client_loop_count = 0;
     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
    20129thread Client {};
    21130void main( Client & this ) {
    22131    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;
    45138    }
    46139    __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST );
     
    50143void main( Server & this ) {
    51144    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;
    66148    }
    67149}
     
    69151int main( int argc, char * argv[] ) {
    70152    switch ( argc ) {
    71           case 3:
    72                 if ( strcmp( argv[2], "d" ) != 0 ) {                    // default ?
    73                         Time = atoi( argv[2] );
    74                 } // if
    75153          case 2:
    76154                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;
    79157                } // if
    80158          case 1:                                                                                       // use defaults
     
    83161          Usage:
    84162                sout | "Usage: " | argv[0]
    85              | " [ clients (> 0) | 'd' (default " | Clients
    86                          | ") ] [ time (>= 0) | 'd' (default " | Time
     163             | "[ time (>= 0) | 'd' (default " | Time
    87164                         | ") ]" ;
    88165                exit( EXIT_FAILURE );
    89166        } // switch
    90     processor p[Clients];
     167    processor p[Processors - 1];
    91168
    92169    {
    93         Client c[Clients];
     170        Server s;
    94171        {
    95             Server s;
     172            Client c;
    96173
    97174            sleep(Time`s);
    98             server_done = true;
     175
     176            client_done = true;
    99177        }
    100         while( available(A) || available(B) || available(C) ) {}
    101         client_done = true;
    102         fulfil( C, 0 );
     178        server_done = true;
     179        done_loop = true;
    103180    }
    104181    printf("%zu\n", globalTotal);
Note: See TracChangeset for help on using the changeset viewer.