Ignore:
Timestamp:
Dec 14, 2022, 12:23:42 PM (3 years ago)
Author:
caparson <caparson@…>
Branches:
ADT, ast-experimental, master
Children:
441a6a7
Parents:
7d9598d8 (diff), d8bdf13 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Location:
libcfa/src/concurrency
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/invoke.h

    r7d9598d8 r2dcd80a  
    1010// Created On       : Tue Jan 17 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jan  9 19:06:45 2022
    13 // Update Count     : 48
     12// Last Modified On : Tue Nov 29 20:42:21 2022
     13// Update Count     : 56
    1414//
    1515
     
    1717#include "bits/defs.hfa"
    1818#include "bits/locks.hfa"
     19#include "bits/random.hfa"
    1920#include "kernel/fwd.hfa"
    2021
     
    222223                struct processor * last_proc;
    223224
    224                 uint32_t random_state;                                                  // fast random numbers
     225                PRNG_STATE_T random_state;                                              // fast random numbers
    225226
    226227                #if defined( __CFA_WITH_VERIFY__ )
  • libcfa/src/concurrency/kernel.cfa

    r7d9598d8 r2dcd80a  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug 31 07:08:20 2020
    13 // Update Count     : 71
     12// Last Modified On : Wed Nov 30 18:14:08 2022
     13// Update Count     : 76
    1414//
    1515
     
    151151        // Because of a bug, we couldn't initialized the seed on construction
    152152        // Do it here
    153         __cfaabi_tls.rand_seed ^= rdtscl();
     153        PRNG_SET_SEED( __cfaabi_tls.random_state, rdtscl() );
    154154        __cfaabi_tls.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&runner);
    155155        __tls_rand_advance_bck();
  • libcfa/src/concurrency/kernel/fwd.hfa

    r7d9598d8 r2dcd80a  
    4646                        } preemption_state;
    4747
    48                         #if defined(__SIZEOF_INT128__)
    49                                 __uint128_t rand_seed;
    50                         #else
    51                                 uint64_t rand_seed;
    52                         #endif
     48                        PRNG_STATE_T random_state;
     49
    5350                        struct {
    5451                                uint64_t fwd_seed;
     
    5754
    5855                        struct __stats_t        * volatile this_stats;
    59 
    6056
    6157                        #ifdef __CFA_WITH_VERIFY__
     
    7672                #define publicTLS_get( member ) ((typeof(__cfaabi_tls.member))__cfatls_get( __builtin_offsetof(KernelThreadData, member) ))
    7773
    78                 static inline uint64_t __tls_rand() {
    79                         return
    80                         #if defined(__SIZEOF_INT128__)
    81                                 lehmer64( kernelTLS().rand_seed );
    82                         #else
    83                                 xorshift_13_7_17( kernelTLS().rand_seed );
    84                         #endif
     74                static inline
     75                        #ifdef __x86_64__                                                       // 64-bit architecture
     76                        uint64_t
     77                        #else                                                                           // 32-bit architecture
     78                        uint32_t
     79                        #endif // __x86_64__
     80                __tls_rand() {
     81                        return PRNG_NAME( kernelTLS().random_state );
    8582                }
    8683
     
    120117
    121118                // Yield: yield N times
    122                 static inline void yield( unsigned times ) {
     119                static inline void yield( size_t times ) {
    123120                        for( times ) {
    124121                                yield();
  • libcfa/src/concurrency/kernel/startup.cfa

    r7d9598d8 r2dcd80a  
    3939#include "limits.hfa"
    4040#include "math.hfa"
     41#include "bits/random.hfa"                                                              // prng
    4142
    4243#define CFA_PROCESSOR_USE_MMAP 0
     
    107108extern void __wake_proc(processor *);
    108109extern int cfa_main_returned;                                                   // from interpose.cfa
    109 uint32_t __global_random_prime = 4_294_967_291u, __global_random_mask = false;
     110size_t __global_random_prime = 4_294_967_291u;
     111bool __global_random_mask = false;
    110112
    111113//-----------------------------------------------------------------------------
     
    133135// Global state
    134136__thread struct KernelThreadData __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" ))) @= {
    135         NULL,                                                                                           // cannot use 0p
    136         NULL,
    137         false,
    138         { 1, false, false },
    139         0,
    140         { 0, 0 },
    141         NULL,
     137        .this_thread : NULL,                                                            // cannot use 0p
     138        .this_processor : NULL,
     139        .sched_lock : false,
     140        .preemption_state : { .disable_count : 1, .enabled : false, .in_progress : false },
     141        // random_state uninitialized
     142        .ready_rng : { .fwd_seed : 0, .bck_seed : 0 },
     143        .this_stats : NULL,
    142144        #ifdef __CFA_WITH_VERIFY__
    143                 false,
    144                 0,
     145                .in_sched_lock : false,
     146                .sched_id : 0,
    145147        #endif
    146148};
     
    513515        rdy_link.next = 0p;
    514516        rdy_link.ts   = MAX;
     517        user_link.next = 0p;
     518        user_link.prev = 0p;
     519        cltr_link.next = 0p;
     520        cltr_link.prev = 0p;
    515521        preferred = ready_queue_new_preferred();
    516522        last_proc = 0p;
    517         random_state = __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl();
     523        PRNG_SET_SEED( random_state,  __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl() );
    518524        #if defined( __CFA_WITH_VERIFY__ )
    519525                executing = 0p;
  • libcfa/src/concurrency/stats.cfa

    r7d9598d8 r2dcd80a  
    4848                        stats->io.submit.eagr       = 0;
    4949                        stats->io.submit.nblk       = 0;
     50                        stats->io.submit.extr       = 0;
    5051                        stats->io.flush.external    = 0;
     52                        stats->io.flush.signal      = 0;
    5153                        stats->io.flush.dirty       = 0;
    5254                        stats->io.flush.full        = 0;
     
    120122                        tally_one( &cltr->io.submit.eagr      , &proc->io.submit.eagr       );
    121123                        tally_one( &cltr->io.submit.nblk      , &proc->io.submit.nblk       );
     124                        tally_one( &cltr->io.submit.extr      , &proc->io.submit.extr       );
    122125                        tally_one( &cltr->io.flush.external   , &proc->io.flush.external    );
     126                        tally_one( &cltr->io.flush.signal     , &proc->io.flush.signal      );
    123127                        tally_one( &cltr->io.flush.dirty      , &proc->io.flush.dirty       );
    124128                        tally_one( &cltr->io.flush.full       , &proc->io.flush.full        );
     
    199203                                if(io.alloc.slow) {
    200204                                        double avgfasts = (100.0 * (double)io.submit.fast) / total_submits;
    201                                         sstr | "fast," | eng3(io.submit.slow) | "slow (" | ws(3, 3, avgfasts) | "%)" | nonl;
     205                                        sstr | "fast," | eng3(io.submit.slow) | "slow (" | ws(3, 3, avgfasts) | "%)," | eng3(io.submit.extr) | "external" | nonl;
    202206                                }
    203207                                sstr | " - eager" | eng3(io.submit.eagr) | nonl;
     
    217221                                     | " - cmp " | eng3(io.calls.locked) | "locked, " | eng3(io.calls.helped) | "helped"
    218222                                     | " - " | eng3(io.calls.errors.busy) | " EBUSY";
    219                                 sstr | " - sub: " | eng3(io.flush.full) | "full, " | eng3(io.flush.dirty) | "drty, " | eng3(io.flush.idle) | "idle, " | eng3(io.flush.eager) | "eagr, " | eng3(io.flush.external) | "ext";
     223                                sstr | " - sub: " | eng3(io.flush.full) | "full, " | eng3(io.flush.dirty) | "drty, " | eng3(io.flush.idle) | "idle, " | eng3(io.flush.eager) | "eagr, " | eng3(io.flush.external) | '/' | eng3(io.flush.signal) | "ext";
    220224                                sstr | "- ops blk: "
    221225                                     |   " sk rd: " | eng3(io.ops.sockread)  | "epll: " | eng3(io.ops.epllread)
  • libcfa/src/concurrency/stats.hfa

    r7d9598d8 r2dcd80a  
    9494                                volatile uint64_t eagr;
    9595                                volatile uint64_t nblk;
     96                                volatile uint64_t extr;
    9697                        } submit;
    9798                        struct {
    9899                                volatile uint64_t external;
     100                                volatile uint64_t signal;
    99101                                volatile uint64_t dirty;
    100102                                volatile uint64_t full;
  • libcfa/src/concurrency/thread.cfa

    r7d9598d8 r2dcd80a  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 12 15:24:18 2022
    13 // Update Count     : 66
     12// Last Modified On : Sun Dec 11 20:56:54 2022
     13// Update Count     : 102
    1414//
    1515
     
    2626#include "invoke.h"
    2727
    28 extern uint32_t __global_random_seed, __global_random_prime, __global_random_mask;
     28extern size_t __global_random_seed;
     29extern size_t __global_random_prime;
     30extern bool __global_random_mask;
    2931
    3032#pragma GCC visibility push(default)
     
    4648        rdy_link.next = 0p;
    4749        rdy_link.ts   = MAX;
     50        user_link.next = 0p;
     51        user_link.prev = 0p;
     52        cltr_link.next = 0p;
     53        cltr_link.prev = 0p;
    4854        preferred = ready_queue_new_preferred();
    4955        last_proc = 0p;
    50         random_state = __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl();
     56        PRNG_SET_SEED( random_state, __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl() );
    5157        #if defined( __CFA_WITH_VERIFY__ )
    5258                executing = 0p;
     
    176182//-----------------------------------------------------------------------------
    177183bool migrate( thread$ * thrd, struct cluster & cl ) {
    178 
    179184        monitor$ * tmon = get_monitor(thrd);
    180185        monitor$ * __monitors[] = { tmon };
    181186        monitor_guard_t __guard = { __monitors, 1 };
    182 
    183 
    184187        {
    185188                // if nothing needs to be done, return false
     
    221224
    222225//-----------------------------------------------------------------------------
    223 #define GENERATOR LCG
    224 
    225 void set_seed( uint32_t seed ) {
    226         uint32_t & state = active_thread()->random_state;
    227         state = __global_random_seed = seed;
    228         GENERATOR( state );
    229         __global_random_prime = state;
     226
     227void set_seed( size_t seed ) {
     228        PRNG_STATE_T & state = active_thread()->random_state;
     229        PRNG_SET_SEED( state, seed );
     230        __global_random_seed = seed;
     231        __global_random_prime = seed;
    230232        __global_random_mask = true;
    231233} // set_seed
    232234
    233 uint32_t prng( void ) {                                                                 // [0,UINT_MAX]
    234         uint32_t & state = active_thread()->random_state;
    235         return GENERATOR( state );
     235size_t prng( void ) {                                                                   // [0,UINT_MAX]
     236        return PRNG_NAME( active_thread()->random_state );
    236237} // prng
    237238
  • libcfa/src/concurrency/thread.hfa

    r7d9598d8 r2dcd80a  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb 11 16:34:07 2022
    13 // Update Count     : 20
     12// Last Modified On : Tue Nov 22 22:18:34 2022
     13// Update Count     : 35
    1414//
    1515
     
    2323#include "monitor.hfa"
    2424#include "exception.hfa"
     25#include "bits/random.hfa"
    2526
    2627//-----------------------------------------------------------------------------
     
    141142//----------
    142143// prng
     144void set_seed( size_t seed );
    143145static inline {
    144         uint32_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return LCG( th.random_state ); } // [0,UINT_MAX]
    145         uint32_t prng( thread$ & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
    146         uint32_t prng( thread$ & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
     146        size_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return PRNG_NAME( th.random_state ); } // [0,UINT_MAX]
     147        size_t prng( thread$ & th, size_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
     148        size_t prng( thread$ & th, size_t l, size_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
    147149        forall( T & | is_thread(T) ) {
    148                 uint32_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]
    149                 uint32_t prng( T & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
    150                 uint32_t prng( T & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
     150                size_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]
     151                size_t prng( T & th, size_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)
     152                size_t prng( T & th, size_t l, size_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]
    151153        } // distribution
    152154} // distribution
Note: See TracChangeset for help on using the changeset viewer.