Changeset d2ad151
- Timestamp:
- Nov 20, 2022, 10:24:14 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 910e1d0
- Parents:
- 25b0fde
- Files:
-
- 1 added
- 1 deleted
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/random.hfa
r25b0fde rd2ad151 10 10 // Created On : Fri Jan 14 07:18:11 2022 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jan 14 07:18:58202213 // Update Count : 112 // Last Modified On : Sat Nov 19 17:47:43 2022 13 // Update Count : 8 14 14 // 15 15 … … 18 18 #include <stdint.h> 19 19 20 #ifdef __x86_64__ // 64-bit architecture 21 #define LEHMER64 22 #else // 32-bit architecture 23 #define XORSHIFT_6_21_7 24 #endif // __x86_64__ 25 20 26 // Pipelined to allow out-of-order overlap with reduced dependencies. Critically, the current random state is returned 21 27 // (copied), and then compute and store the next random value. … … 23 29 #if defined(__SIZEOF_INT128__) 24 30 //-------------------------------------------------- 31 #ifdef LEHMER64 32 #define PRNG_ARG_T __uint128_t 33 #define PRNG_NAME lehmer64 34 #endif // LEHMER64 35 25 36 static inline uint64_t lehmer64( __uint128_t & state ) { 26 37 __uint128_t ret = state; … … 51 62 52 63 //-------------------------------------------------- 64 65 #ifdef XORSHIFT_6_21_7 66 #define PRNG_ARG_T uint32_t 67 #define PRNG_NAME xorshift_6_21_7 68 #endif // XORSHIFT_6_21_7 69 53 70 static inline uint32_t xorshift_6_21_7( uint32_t & state ) { 54 71 uint32_t ret = state; -
libcfa/src/concurrency/invoke.h
r25b0fde rd2ad151 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 : 4 812 // Last Modified On : Fri Nov 18 12:20:26 2022 13 // Update Count : 49 14 14 // 15 15 … … 222 222 struct processor * last_proc; 223 223 224 uint32_t random_state;// fast random numbers224 __uint128_t random_state; // fast random numbers 225 225 226 226 #if defined( __CFA_WITH_VERIFY__ ) -
libcfa/src/concurrency/kernel/startup.cfa
r25b0fde rd2ad151 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 PRNG_ARG_T __global_random_prime = 4_294_967_291u; 111 bool __global_random_mask = false; 110 112 111 113 //----------------------------------------------------------------------------- -
libcfa/src/concurrency/thread.cfa
r25b0fde rd2ad151 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 Nov 20 17:17:50 2022 13 // Update Count : 80 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 PRNG_ARG_T __global_random_seed, __global_random_prime; 29 extern bool __global_random_mask; 29 30 30 31 #pragma GCC visibility push(default) … … 221 222 222 223 //----------------------------------------------------------------------------- 223 #define GENERATOR LCG 224 225 void set_seed( uint32_t seed ) { 226 uint32_t & state = active_thread()->random_state; 224 225 void set_seed( uint64_t seed ) { 226 PRNG_ARG_T & state = active_thread()->random_state; 227 227 state = __global_random_seed = seed; 228 GENERATOR( state );228 (void)PRNG_NAME( state ); // prime PRNG 229 229 __global_random_prime = state; 230 230 __global_random_mask = true; 231 231 } // set_seed 232 232 233 uint 32_t prng( void ) { // [0,UINT_MAX]234 uint32_t& state = active_thread()->random_state;235 return GENERATOR( state );233 uint64_t prng( void ) { // [0,UINT_MAX] 234 PRNG_ARG_T & state = active_thread()->random_state; 235 return PRNG_NAME( state ); 236 236 } // prng 237 237 -
libcfa/src/concurrency/thread.hfa
r25b0fde rd2ad151 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:07 202213 // Update Count : 2012 // Last Modified On : Sat Nov 19 16:41:27 2022 13 // Update Count : 30 14 14 // 15 15 … … 23 23 #include "monitor.hfa" 24 24 #include "exception.hfa" 25 #include "bits/random.hfa" 25 26 26 27 //----------------------------------------------------------------------------- … … 142 143 // prng 143 144 static inline { 144 uint 32_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return LCG( th.random_state ); } // [0,UINT_MAX]145 uint 32_t prng( thread$ & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)146 uint 32_t prng( thread$ & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]145 uint64_t prng( thread$ & th ) __attribute__(( warn_unused_result )) { return PRNG_NAME( th.random_state ); } // [0,UINT_MAX] 146 uint64_t prng( thread$ & th, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u) 147 uint64_t prng( thread$ & th, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u] 147 148 forall( T & | is_thread(T) ) { 148 uint 32_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX]149 uint 32_t prng( T & th, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u)150 uint 32_t prng( T & th, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u]149 uint64_t prng( T & th ) __attribute__(( warn_unused_result )) { return prng( (thread &)th ); } // [0,UINT_MAX] 150 uint64_t prng( T & th, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th ) % u; } // [0,u) 151 uint64_t prng( T & th, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( th, u - l + 1 ) + l; } // [l,u] 151 152 } // distribution 152 153 } // distribution -
libcfa/src/startup.cfa
r25b0fde rd2ad151 10 10 // Created On : Tue Jul 24 16:21:57 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Oct 6 13:51:57202213 // Update Count : 5 712 // Last Modified On : Sun Nov 20 21:26:40 2022 13 // Update Count : 59 14 14 // 15 15 … … 18 18 #include <stdlib.h> // getenv 19 19 #include "bits/defs.hfa" // rdtscl 20 #include "bits/random.hfa" // rdtscl 20 21 #include "startup.hfa" 21 22 22 extern uint32_t__global_random_seed; // sequential/concurrent23 extern uint32_t __global_random_state;// sequential23 extern PRNG_ARG_T __global_random_seed; // sequential/concurrent 24 extern PRNG_ARG_T __global_random_state; // sequential 24 25 25 26 extern "C" { -
libcfa/src/stdlib.cfa
r25b0fde rd2ad151 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Aug 25 22:41:14202213 // Update Count : 6 0412 // Last Modified On : Sat Nov 19 16:42:26 2022 13 // Update Count : 612 14 14 // 15 15 … … 225 225 //--------------------------------------- 226 226 227 #define GENERATOR LCG228 229 227 // would be cool to make hidden but it's needed for libcfathread 230 __attribute__((visibility("default"))) uint32_t __global_random_seed; // sequential/concurrent 231 __attribute__((visibility("hidden"))) uint32_t __global_random_state; // sequential only 232 233 void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; GENERATOR( state ); } // set seed 234 235 void set_seed( uint32_t seed ) { __global_random_state = __global_random_seed = seed; GENERATOR( __global_random_state ); } 236 uint32_t get_seed() { return __global_random_seed; } 237 uint32_t prng( void ) { return GENERATOR( __global_random_state ); } // [0,UINT_MAX] 228 __attribute__((visibility("default"))) PRNG_ARG_T __global_random_seed; // sequential/concurrent 229 __attribute__((visibility("hidden"))) PRNG_ARG_T __global_random_state; // sequential only 230 231 void set_seed( uint64_t seed ) { __global_random_state = __global_random_seed = seed; PRNG_NAME( __global_random_state ); } 232 uint64_t get_seed() { return __global_random_seed; } 233 uint64_t prng( void ) { return PRNG_NAME( __global_random_state ); } // [0,UINT_MAX] 238 234 239 235 //--------------------------------------- -
libcfa/src/stdlib.hfa
r25b0fde rd2ad151 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Aug 25 18:07:06202213 // Update Count : 64512 // Last Modified On : Sun Nov 20 17:12:37 2022 13 // Update Count : 730 14 14 // 15 15 … … 404 404 // calls( sprng ); 405 405 406 struct PRNG { 406 trait basic_prng( PRNG &, S, R ) { 407 void set_seed( PRNG & prng, S seed ); // set seed 408 S get_seed( PRNG & prng ); // get seed 409 R prng( PRNG & prng ); 410 void ?{}( PRNG & prng ); // random seed 411 void ?{}( PRNG & prng, S seed ); // fixed seed 412 }; // basic_prng 413 414 static inline forall( PRNG &, S, R | basic_prng( PRNG, S, R ) | { R ?%?( R, R ); } ) { 415 R prng( PRNG & prng, R u ) { return prng( prng ) % u; } // [0,u) 416 } 417 static inline forall( PRNG &, S, R | basic_prng( PRNG, S, R ) | { R ?+?( R, R ); R ?-?( R, R ); R ?%?( R, R ); void ?{}( R &, one_t ); } ) { 418 R prng( PRNG & prng, R l, R u ) { return prng( prng, u - l + (R){1} ) + l; } // [l,u] 419 } 420 421 struct PRNG32 { 407 422 uint32_t callcnt; // call count 408 423 uint32_t seed; // current seed 409 uint32_t state;// random state424 PRNG_ARG_T state; // random state 410 425 }; // PRNG 411 426 412 void set_seed( PRNG & prng, uint32_t seed_ ); 413 static inline { 414 void ?{}( PRNG & prng ) with( prng ) { callcnt = 0; set_seed( prng, rdtscl() ); } // random seed 415 void ?{}( PRNG & prng, uint32_t seed ) with( prng ) { callcnt = 0; set_seed( prng, seed ); } // fixed seed 416 uint32_t get_seed( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed 417 uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { callcnt += 1; return LCG( state ); } // [0,UINT_MAX] 418 uint32_t prng( PRNG & prng, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng ) % u; } // [0,u) 419 uint32_t prng( PRNG & prng, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng, u - l + 1 ) + l; } // [l,u] 420 uint32_t calls( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; } 427 static inline { 428 void set_seed( PRNG32 & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; PRNG_NAME( state ); } // set seed 429 uint32_t get_seed( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed 430 uint32_t prng( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { callcnt += 1; return PRNG_NAME( state ); } // [0,UINT_MAX] 431 uint32_t calls( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; } 432 void ?{}( PRNG32 & prng ) with( prng ) { callcnt = 0; set_seed( prng, rdtscl() ); } // random seed 433 void ?{}( PRNG32 & prng, uint32_t seed ) with( prng ) { callcnt = 0; set_seed( prng, seed ); } // fixed seed 434 } // distribution 435 436 struct PRNG64 { 437 uint64_t callcnt; // call count 438 uint64_t seed; // current seed 439 PRNG_ARG_T state; // random state 440 }; // PRNG 441 442 static inline { 443 void set_seed( PRNG64 & prng, uint64_t seed_ ) with( prng ) { state = seed = seed_; PRNG_NAME( state ); } // set seed 444 uint64_t get_seed( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed 445 uint64_t prng( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { callcnt += 1; return PRNG_NAME( state ); } // [0,UINT_MAX] 446 uint64_t calls( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; } 447 void ?{}( PRNG64 & prng ) with( prng ) { callcnt = 0; set_seed( prng, rdtscl() ); } // random seed 448 void ?{}( PRNG64 & prng, uint64_t seed ) with( prng ) { callcnt = 0; set_seed( prng, seed ); } // fixed seed 421 449 } // distribution 422 450 … … 435 463 // prng( 5, 21 ); 436 464 437 void set_seed( uint32_t seed_ ) OPTIONAL_THREAD; 438 uint32_t get_seed() __attribute__(( warn_unused_result )); 439 uint32_t prng( void ) __attribute__(( warn_unused_result )) OPTIONAL_THREAD; // [0,UINT_MAX] 440 static inline { 441 uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result )) { return prng() % u; } // [0,u) 442 uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( u - l + 1 ) + l; } // [l,u] 465 // Harmonize with concurrency/thread.hfa. 466 void set_seed( uint64_t seed_ ) OPTIONAL_THREAD; 467 uint64_t get_seed() __attribute__(( warn_unused_result )); 468 uint64_t prng( void ) __attribute__(( warn_unused_result )) OPTIONAL_THREAD; // [0,UINT_MAX] 469 static inline { 470 uint64_t prng( uint64_t u ) __attribute__(( warn_unused_result )) { return prng() % u; } // [0,u) 471 uint64_t prng( uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( u - l + 1 ) + l; } // [l,u] 443 472 } // distribution 444 473 -
tests/.expect/nested_function.txt
r25b0fde rd2ad151 1 total 1051 total 80 -
tests/PRNG.cfa
r25b0fde rd2ad151 8 8 // Created On : Wed Dec 29 09:38:12 2021 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : S at Apr 9 15:21:14202211 // Update Count : 3 4410 // Last Modified On : Sun Nov 20 22:17:35 2022 11 // Update Count : 377 12 12 // 13 13 … … 22 22 #include <mutex_stmt.hfa> 23 23 24 #ifdef __x86_64__ // 64-bit architecture 25 #define PRNG PRNG64 26 #else // 32-bit architecture 27 #define PRNG PRNG32 28 #endif // __x86_64__ 29 24 30 #ifdef TIME // use -O2 -nodebug 25 31 #define STARTTIME start = timeHiRes() … … 54 60 55 61 56 u int32_t seed = 1009;62 unsigned int seed = 1009; 57 63 58 64 thread T1 {}; … … 158 164 #if 1 159 165 PRNG prng; 166 160 167 if ( seed != 0 ) set_seed( prng, seed ); 161 168 … … 164 171 for ( 20 ) { 165 172 sout | wd(13, prng( prng )) | nonl; // cascading => side-effect functions called in arbitary order 166 sout | wd(10, prng( prng, 5 )) | nonl;167 sout | wd(13, prng( prng, 0, 5 ));173 sout | wd(10, prng( prng, 5z )) | nonl; 174 sout | wd(13, prng( prng, 0, 5z )); 168 175 } // for 169 176 sout | sepEnable; … … 199 206 for ( 20 ) { 200 207 sout | wd(13, prng()) | nonl; // cascading => side-effect functions called in arbitary order 201 sout | wd(10, prng( 5 )) | nonl;202 sout | wd(13, prng( 0, 5 ));208 sout | wd(10, prng( 5z )) | nonl; 209 sout | wd(13, prng( 0, 5z )); 203 210 } // for 204 211 sout | sepEnable; … … 235 242 for ( 20 ) { 236 243 sout | wd(13, prng( th )) | nonl; // cascading => side-effect functions called in arbitary order 237 sout | wd(10, prng( th, 5 )) | nonl;238 sout | wd(13, prng( th, 0, 5 ));244 sout | wd(10, prng( th, 5z )) | nonl; 245 sout | wd(13, prng( th, 0, 5z )); 239 246 } // for 240 247 sout | sepEnable; -
tests/concurrent/barrier/generation.cfa
r25b0fde rd2ad151 37 37 for(c; 'A' ~= 'Z') { 38 38 // Yield for chaos 39 yield( prng(this, 10));39 yield( (unsigned)prng(this, 10) ); 40 40 41 41 // Print the generation, no newline because … … 43 43 44 44 // Yield again for more chaos 45 yield( prng(this, 10));45 yield( (unsigned)prng(this, 10) ); 46 46 47 47 // Block on the barrier -
tests/concurrent/barrier/order.cfa
r25b0fde rd2ad151 37 37 for(l; NUM_LAPS) { 38 38 // Yield for chaos 39 yield( prng(this, 10));39 yield( (unsigned)prng(this, 10) ); 40 40 41 41 // Block and what order we arrived -
tests/concurrent/once.cfa
r25b0fde rd2ad151 30 30 31 31 // sometime yields 32 yield( prng(this, 3));32 yield( (unsigned)prng(this, 3) ); 33 33 } 34 34 } -
tests/concurrent/readyQ/leader_spin.cfa
r25b0fde rd2ad151 26 26 } 27 27 28 PRNG lead_rng;28 PRNG64 lead_rng; 29 29 volatile unsigned leader; 30 30 volatile size_t lead_idx; 31 31 32 const u nsignednthreads = 17;33 const u nsignedstop_count = 327;32 const uint64_t nthreads = 17; 33 const uint64_t stop_count = 327; 34 34 35 35 thread$ * the_main; -
tests/io/away_fair.cfa
r25b0fde rd2ad151 67 67 #endif 68 68 69 yield( prng( this, 15 ) );69 yield( (unsigned)prng( this, 15 ) ); 70 70 71 71 #if CFA_HAVE_LINUX_IO_URING_H -
tests/io/comp_basic.cfa
r25b0fde rd2ad151 58 58 block( globals.bar ); 59 59 60 yield( prng( this, 15 ) );60 yield( (unsigned)prng( this, 15 ) ); 61 61 62 62 unsigned i = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST ); -
tests/io/comp_fair.cfa
r25b0fde rd2ad151 78 78 block( globals.bar ); 79 79 80 yield( prng( this, 15 ) );80 yield( (unsigned)prng( this, 15 ) ); 81 81 82 82 unsigned i = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST );
Note:
See TracChangeset
for help on using the changeset viewer.