Changes in / [00f5fde:07a1e7a]
- Location:
- libcfa/src
- Files:
-
- 5 edited
-
concurrency/kernel/startup.cfa (modified) (2 diffs)
-
concurrency/thread.cfa (modified) (5 diffs)
-
startup.cfa (modified) (3 diffs)
-
stdlib.cfa (modified) (2 diffs)
-
stdlib.hfa (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/startup.cfa
r00f5fde r07a1e7a 101 101 extern void __wake_proc(processor *); 102 102 extern int cfa_main_returned; // from interpose.cfa 103 extern uint32_t __global_random_seed;104 103 105 104 //----------------------------------------------------------------------------- … … 490 489 preferred = ready_queue_new_preferred(); 491 490 last_proc = 0p; 492 random_state = __global_random_seed;493 491 #if defined( __CFA_WITH_VERIFY__ ) 494 492 canary = 0x0D15EA5E0D15EA5Ep; -
libcfa/src/concurrency/thread.cfa
r00f5fde r07a1e7a 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 12 18:46:48202213 // Update Count : 3612 // Last Modified On : Mon Jan 10 17:05:35 2022 13 // Update Count : 28 14 14 // 15 15 … … 27 27 uint64_t thread_rand(); 28 28 29 extern uint32_t __ global_random_seed;29 extern uint32_t __thread_seed; // global thread seed 30 30 31 31 //----------------------------------------------------------------------------- … … 41 41 self_mon.owner = &this; 42 42 self_mon.recursion = 1; 43 random_state = __thread_seed; 43 44 self_mon_p = &self_mon; 44 45 curr_cluster = &cl; … … 47 48 preferred = ready_queue_new_preferred(); 48 49 last_proc = 0p; 49 random_state = __global_random_seed;50 50 #if defined( __CFA_WITH_VERIFY__ ) 51 51 canary = 0x0D15EA5E0D15EA5Ep; … … 180 180 return ret; 181 181 } 182 182 183 183 #define GENERATOR LCG 184 184 185 static inline uint32_t MarsagliaXor( uint32_t & state ) { 186 uint32_t ret = state; 185 inline uint32_t MarsagliaXor( uint32_t & state ) { 187 186 state ^= state << 6; 188 187 state ^= state >> 21; 189 188 state ^= state << 7; 190 return ret;189 return state; 191 190 } // MarsagliaXor 192 191 193 static inline uint32_t LCG( uint32_t & state ) { // linear congruential generator 194 uint32_t ret = state; 195 state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime! No not change it! 196 return ret; 192 inline uint32_t LCG( uint32_t & state ) { // linear congruential generator 193 return state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime! 197 194 } // LCG 198 195 199 void set_seed( uint32_t seed ) { 200 active_thread()->random_state = __global_random_seed = seed; 201 GENERATOR( active_thread()->random_state ); 202 } // set_seed 196 void set_seed( uint32_t seed ) { active_thread()->random_state = seed; __thread_seed = seed; } 203 197 uint32_t prng( void ) { return GENERATOR( active_thread()->random_state ); } // [0,UINT_MAX] 204 198 -
libcfa/src/startup.cfa
r00f5fde r07a1e7a 10 10 // Created On : Tue Jul 24 16:21:57 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 12 18:51:24 202213 // Update Count : 5112 // Last Modified On : Sat Jan 9 23:18:23 2021 13 // Update Count : 34 14 14 // 15 15 … … 18 18 #include <stdlib.h> // getenv 19 19 #include "startup.hfa" 20 #include "bits/defs.hfa"21 22 extern uint32_t __global_random_seed, __global_random_state;23 20 24 21 extern "C" { … … 51 48 void __cfaabi_core_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_CORE ) )); 52 49 void __cfaabi_core_startup( void ) { 53 __global_random_state = __global_random_seed = rdtscl();54 50 __cfaabi_interpose_startup(); 55 51 __cfaabi_device_startup(); -
libcfa/src/stdlib.cfa
r00f5fde r07a1e7a 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 12 18:52:41 202213 // Update Count : 5 8212 // Last Modified On : Mon Jan 10 17:07:21 2022 13 // Update Count : 572 14 14 // 15 15 … … 223 223 //--------------------------------------- 224 224 225 // Pipelined to allow OoO overlap with reduced dependencies. Critically, return the current value, and compute and store226 // the next value.227 228 225 #define GENERATOR LCG 229 226 230 static inline uint32_t MarsagliaXor( uint32_t & state ) { 231 uint32_t ret = state; 227 inline uint32_t MarsagliaXor( uint32_t & state ) { 232 228 state ^= state << 6; 233 229 state ^= state >> 21; 234 230 state ^= state << 7; 235 return ret;231 return state; 236 232 } // MarsagliaXor 237 233 238 static inline uint32_t LCG( uint32_t & state ) { // linear congruential generator 239 uint32_t ret = state; 240 state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime! No not change it! 241 return ret; 234 inline uint32_t LCG( uint32_t & state ) { // linear congruential generator 235 return state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime! 242 236 } // LCG 243 237 244 uint32_t __ global_random_seed; // sequential/concurrent245 uint32_t __global_random_state; // sequential only 246 247 void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; GENERATOR( state ); } // set seed 238 uint32_t __thread_seed = rdtscl(); // global thread seed 239 240 void set_seed( uint32_t seed ) { __thread_seed = seed; } 241 uint32_t get_seed() { return __thread_seed; } 248 242 uint32_t prng( PRNG & prng ) with( prng ) { callcnt += 1; return GENERATOR( state ); } 249 243 250 void set_seed( uint32_t seed ) { __global_random_seed = seed; GENERATOR( __global_random_state ); } 251 uint32_t get_seed() { return __global_random_seed; } 252 uint32_t prng( void ) { return GENERATOR( __global_random_state ); } // [0,UINT_MAX] 244 uint32_t prng( void ) { return GENERATOR( __thread_seed ); } // [0,UINT_MAX] 253 245 254 246 //--------------------------------------- -
libcfa/src/stdlib.hfa
r00f5fde r07a1e7a 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 12 18:56:13202213 // Update Count : 6 2112 // Last Modified On : Mon Jan 10 17:03:18 2022 13 // Update Count : 619 14 14 // 15 15 … … 386 386 //--------------------------------------- 387 387 388 // Sequential Pseudo Random-Number Generator : generate repeatable sequence of values that appear random.389 //390 // Declaration :391 // PRNG sprng = { 1009 } - set starting seed versus random seed392 //393 // Interface :394 // set_seed( sprng, 1009 ) - set starting seed for ALL kernel threads versus random seed395 // get_seed( sprng ) - read seed396 // prng( sprng ) - generate random value in range [0,UINT_MAX]397 // prng( sprng, u ) - generate random value in range [0,u)398 // prng( sprng, l, u ) - generate random value in range [l,u]399 // calls( sprng ) - number of generated random value so far400 //401 // Examples : generate random number between 5-21402 // prng( sprng ) % 17 + 5; values 0-16 + 5 = 5-21403 // prng( sprng, 16 + 1 ) + 5;404 // prng( sprng, 5, 21 );405 // calls( sprng );406 407 388 struct PRNG { 408 389 uint32_t callcnt; // call count … … 411 392 }; // PRNG 412 393 413 void set_seed( PRNG & prng, uint32_t seed_ );414 394 uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX] 415 395 static inline { 396 void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; } // set seed 416 397 void ?{}( PRNG & prng ) { set_seed( prng, rdtscl() ); } // random seed 417 398 void ?{}( PRNG & prng, uint32_t seed ) { set_seed( prng, seed ); } // fixed seed … … 422 403 } // distribution 423 404 424 // Concurrent Pseudo Random-Number Generator : generate repeatable sequence of values that appear random.425 //426 // Interface :427 // set_seed( 1009 ) - fixed seed for all kernel threads versus random seed428 // get_seed() - read seed429 // prng() - generate random value in range [0,UINT_MAX]430 // prng( u ) - generate random value in range [0,u)431 // prng( l, u ) - generate random value in range [l,u]432 //433 // Examples : generate random number between 5-21434 // prng() % 17 + 5; values 0-16 + 5 = 5-21435 // prng( 16 + 1 ) + 5;436 // prng( 5, 21 );437 438 405 void set_seed( uint32_t seed_ ) OPTIONAL_THREAD; 439 406 uint32_t get_seed() __attribute__(( warn_unused_result ));
Note:
See TracChangeset
for help on using the changeset viewer.