Changeset 2dcd80a for libcfa/src/concurrency
- Timestamp:
- Dec 14, 2022, 12:23:42 PM (3 years ago)
- 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. - Location:
- libcfa/src/concurrency
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/invoke.h
r7d9598d8 r2dcd80a 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Jan 9 19:06:45202213 // Update Count : 4812 // Last Modified On : Tue Nov 29 20:42:21 2022 13 // Update Count : 56 14 14 // 15 15 … … 17 17 #include "bits/defs.hfa" 18 18 #include "bits/locks.hfa" 19 #include "bits/random.hfa" 19 20 #include "kernel/fwd.hfa" 20 21 … … 222 223 struct processor * last_proc; 223 224 224 uint32_t random_state;// fast random numbers225 PRNG_STATE_T random_state; // fast random numbers 225 226 226 227 #if defined( __CFA_WITH_VERIFY__ ) -
libcfa/src/concurrency/kernel.cfa
r7d9598d8 r2dcd80a 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 31 07:08:20 202013 // Update Count : 7 112 // Last Modified On : Wed Nov 30 18:14:08 2022 13 // Update Count : 76 14 14 // 15 15 … … 151 151 // Because of a bug, we couldn't initialized the seed on construction 152 152 // Do it here 153 __cfaabi_tls.rand_seed ^= rdtscl();153 PRNG_SET_SEED( __cfaabi_tls.random_state, rdtscl() ); 154 154 __cfaabi_tls.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&runner); 155 155 __tls_rand_advance_bck(); -
libcfa/src/concurrency/kernel/fwd.hfa
r7d9598d8 r2dcd80a 46 46 } preemption_state; 47 47 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 53 50 struct { 54 51 uint64_t fwd_seed; … … 57 54 58 55 struct __stats_t * volatile this_stats; 59 60 56 61 57 #ifdef __CFA_WITH_VERIFY__ … … 76 72 #define publicTLS_get( member ) ((typeof(__cfaabi_tls.member))__cfatls_get( __builtin_offsetof(KernelThreadData, member) )) 77 73 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 ); 85 82 } 86 83 … … 120 117 121 118 // Yield: yield N times 122 static inline void yield( unsignedtimes ) {119 static inline void yield( size_t times ) { 123 120 for( times ) { 124 121 yield(); -
libcfa/src/concurrency/kernel/startup.cfa
r7d9598d8 r2dcd80a 39 39 #include "limits.hfa" 40 40 #include "math.hfa" 41 #include "bits/random.hfa" // prng 41 42 42 43 #define CFA_PROCESSOR_USE_MMAP 0 … … 107 108 extern void __wake_proc(processor *); 108 109 extern int cfa_main_returned; // from interpose.cfa 109 uint32_t __global_random_prime = 4_294_967_291u, __global_random_mask = false; 110 size_t __global_random_prime = 4_294_967_291u; 111 bool __global_random_mask = false; 110 112 111 113 //----------------------------------------------------------------------------- … … 133 135 // Global state 134 136 __thread struct KernelThreadData __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" ))) @= { 135 NULL,// cannot use 0p136 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, 142 144 #ifdef __CFA_WITH_VERIFY__ 143 false,144 0,145 .in_sched_lock : false, 146 .sched_id : 0, 145 147 #endif 146 148 }; … … 513 515 rdy_link.next = 0p; 514 516 rdy_link.ts = MAX; 517 user_link.next = 0p; 518 user_link.prev = 0p; 519 cltr_link.next = 0p; 520 cltr_link.prev = 0p; 515 521 preferred = ready_queue_new_preferred(); 516 522 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() ); 518 524 #if defined( __CFA_WITH_VERIFY__ ) 519 525 executing = 0p; -
libcfa/src/concurrency/stats.cfa
r7d9598d8 r2dcd80a 48 48 stats->io.submit.eagr = 0; 49 49 stats->io.submit.nblk = 0; 50 stats->io.submit.extr = 0; 50 51 stats->io.flush.external = 0; 52 stats->io.flush.signal = 0; 51 53 stats->io.flush.dirty = 0; 52 54 stats->io.flush.full = 0; … … 120 122 tally_one( &cltr->io.submit.eagr , &proc->io.submit.eagr ); 121 123 tally_one( &cltr->io.submit.nblk , &proc->io.submit.nblk ); 124 tally_one( &cltr->io.submit.extr , &proc->io.submit.extr ); 122 125 tally_one( &cltr->io.flush.external , &proc->io.flush.external ); 126 tally_one( &cltr->io.flush.signal , &proc->io.flush.signal ); 123 127 tally_one( &cltr->io.flush.dirty , &proc->io.flush.dirty ); 124 128 tally_one( &cltr->io.flush.full , &proc->io.flush.full ); … … 199 203 if(io.alloc.slow) { 200 204 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; 202 206 } 203 207 sstr | " - eager" | eng3(io.submit.eagr) | nonl; … … 217 221 | " - cmp " | eng3(io.calls.locked) | "locked, " | eng3(io.calls.helped) | "helped" 218 222 | " - " | 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"; 220 224 sstr | "- ops blk: " 221 225 | " sk rd: " | eng3(io.ops.sockread) | "epll: " | eng3(io.ops.epllread) -
libcfa/src/concurrency/stats.hfa
r7d9598d8 r2dcd80a 94 94 volatile uint64_t eagr; 95 95 volatile uint64_t nblk; 96 volatile uint64_t extr; 96 97 } submit; 97 98 struct { 98 99 volatile uint64_t external; 100 volatile uint64_t signal; 99 101 volatile uint64_t dirty; 100 102 volatile uint64_t full; -
libcfa/src/concurrency/thread.cfa
r7d9598d8 r2dcd80a 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : S at Feb 12 15:24:18202213 // Update Count : 6612 // Last Modified On : Sun Dec 11 20:56:54 2022 13 // Update Count : 102 14 14 // 15 15 … … 26 26 #include "invoke.h" 27 27 28 extern uint32_t __global_random_seed, __global_random_prime, __global_random_mask; 28 extern size_t __global_random_seed; 29 extern size_t __global_random_prime; 30 extern bool __global_random_mask; 29 31 30 32 #pragma GCC visibility push(default) … … 46 48 rdy_link.next = 0p; 47 49 rdy_link.ts = MAX; 50 user_link.next = 0p; 51 user_link.prev = 0p; 52 cltr_link.next = 0p; 53 cltr_link.prev = 0p; 48 54 preferred = ready_queue_new_preferred(); 49 55 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() ); 51 57 #if defined( __CFA_WITH_VERIFY__ ) 52 58 executing = 0p; … … 176 182 //----------------------------------------------------------------------------- 177 183 bool migrate( thread$ * thrd, struct cluster & cl ) { 178 179 184 monitor$ * tmon = get_monitor(thrd); 180 185 monitor$ * __monitors[] = { tmon }; 181 186 monitor_guard_t __guard = { __monitors, 1 }; 182 183 184 187 { 185 188 // if nothing needs to be done, return false … … 221 224 222 225 //----------------------------------------------------------------------------- 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 227 void 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; 230 232 __global_random_mask = true; 231 233 } // set_seed 232 234 233 uint32_t prng( void ) { // [0,UINT_MAX] 234 uint32_t & state = active_thread()->random_state; 235 return GENERATOR( state ); 235 size_t prng( void ) { // [0,UINT_MAX] 236 return PRNG_NAME( active_thread()->random_state ); 236 237 } // prng 237 238 -
libcfa/src/concurrency/thread.hfa
r7d9598d8 r2dcd80a 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 11 16:34:07202213 // Update Count : 2012 // Last Modified On : Tue Nov 22 22:18:34 2022 13 // Update Count : 35 14 14 // 15 15 … … 23 23 #include "monitor.hfa" 24 24 #include "exception.hfa" 25 #include "bits/random.hfa" 25 26 26 27 //----------------------------------------------------------------------------- … … 141 142 //---------- 142 143 // prng 144 void set_seed( size_t seed ); 143 145 static 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] 147 149 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] 151 153 } // distribution 152 154 } // distribution
Note:
See TracChangeset
for help on using the changeset viewer.