Changes in / [00f5fde:07a1e7a]


Ignore:
Location:
libcfa/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/startup.cfa

    r00f5fde r07a1e7a  
    101101extern void __wake_proc(processor *);
    102102extern int cfa_main_returned;                                                   // from interpose.cfa
    103 extern uint32_t __global_random_seed;
    104103
    105104//-----------------------------------------------------------------------------
     
    490489        preferred = ready_queue_new_preferred();
    491490        last_proc = 0p;
    492         random_state = __global_random_seed;
    493491        #if defined( __CFA_WITH_VERIFY__ )
    494492                canary = 0x0D15EA5E0D15EA5Ep;
  • libcfa/src/concurrency/thread.cfa

    r00f5fde r07a1e7a  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 12 18:46:48 2022
    13 // Update Count     : 36
     12// Last Modified On : Mon Jan 10 17:05:35 2022
     13// Update Count     : 28
    1414//
    1515
     
    2727uint64_t thread_rand();
    2828
    29 extern uint32_t __global_random_seed;
     29extern uint32_t __thread_seed;                                                  // global thread seed
    3030
    3131//-----------------------------------------------------------------------------
     
    4141        self_mon.owner = &this;
    4242        self_mon.recursion = 1;
     43        random_state = __thread_seed;
    4344        self_mon_p = &self_mon;
    4445        curr_cluster = &cl;
     
    4748        preferred = ready_queue_new_preferred();
    4849        last_proc = 0p;
    49         random_state = __global_random_seed;
    5050        #if defined( __CFA_WITH_VERIFY__ )
    5151                canary = 0x0D15EA5E0D15EA5Ep;
     
    180180        return ret;
    181181}
    182  
     182
    183183#define GENERATOR LCG
    184184
    185 static inline uint32_t MarsagliaXor( uint32_t & state ) {
    186         uint32_t ret = state;
     185inline uint32_t MarsagliaXor( uint32_t & state ) {
    187186        state ^= state << 6;
    188187        state ^= state >> 21;
    189188        state ^= state << 7;
    190         return ret;
     189        return state;
    191190} // MarsagliaXor
    192191
    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;
     192inline uint32_t LCG( uint32_t & state ) {                               // linear congruential generator
     193        return state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime!
    197194} // LCG
    198195
    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
     196void set_seed( uint32_t seed ) { active_thread()->random_state = seed; __thread_seed = seed; }
    203197uint32_t prng( void ) { return GENERATOR( active_thread()->random_state ); } // [0,UINT_MAX]
    204198
  • libcfa/src/startup.cfa

    r00f5fde r07a1e7a  
    1010// Created On       : Tue Jul 24 16:21:57 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 12 18:51:24 2022
    13 // Update Count     : 51
     12// Last Modified On : Sat Jan  9 23:18:23 2021
     13// Update Count     : 34
    1414//
    1515
     
    1818#include <stdlib.h>                                                                             // getenv
    1919#include "startup.hfa"
    20 #include "bits/defs.hfa"
    21 
    22 extern uint32_t __global_random_seed, __global_random_state;
    2320
    2421extern "C" {
     
    5148        void __cfaabi_core_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_CORE ) ));
    5249        void __cfaabi_core_startup( void ) {
    53                 __global_random_state = __global_random_seed = rdtscl();
    5450                __cfaabi_interpose_startup();
    5551                __cfaabi_device_startup();
  • libcfa/src/stdlib.cfa

    r00f5fde r07a1e7a  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 12 18:52:41 2022
    13 // Update Count     : 582
     12// Last Modified On : Mon Jan 10 17:07:21 2022
     13// Update Count     : 572
    1414//
    1515
     
    223223//---------------------------------------
    224224
    225 // Pipelined to allow OoO overlap with reduced dependencies. Critically, return the current value, and compute and store
    226 // the next value.
    227 
    228225#define GENERATOR LCG
    229226
    230 static inline uint32_t MarsagliaXor( uint32_t & state ) {
    231         uint32_t ret = state;
     227inline uint32_t MarsagliaXor( uint32_t & state ) {
    232228        state ^= state << 6;
    233229        state ^= state >> 21;
    234230        state ^= state << 7;
    235         return ret;
     231        return state;
    236232} // MarsagliaXor
    237233
    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;
     234inline uint32_t LCG( uint32_t & state ) {                               // linear congruential generator
     235        return state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime!
    242236} // LCG
    243237
    244 uint32_t __global_random_seed;                                                  // sequential/concurrent
    245 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
     238uint32_t __thread_seed = rdtscl();                                              // global thread seed
     239
     240void set_seed( uint32_t seed ) { __thread_seed = seed; }
     241uint32_t get_seed() { return  __thread_seed; }
    248242uint32_t prng( PRNG & prng ) with( prng ) { callcnt += 1; return GENERATOR( state ); }
    249243
    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]
     244uint32_t prng( void ) { return GENERATOR( __thread_seed ); } // [0,UINT_MAX]
    253245
    254246//---------------------------------------
  • libcfa/src/stdlib.hfa

    r00f5fde r07a1e7a  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 12 18:56:13 2022
    13 // Update Count     : 621
     12// Last Modified On : Mon Jan 10 17:03:18 2022
     13// Update Count     : 619
    1414//
    1515
     
    386386//---------------------------------------
    387387
    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 seed
    392 //   
    393 // Interface :
    394 //   set_seed( sprng, 1009 ) - set starting seed for ALL kernel threads versus random seed
    395 //   get_seed( sprng ) - read seed
    396 //   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 far
    400 //
    401 // Examples : generate random number between 5-21
    402 //   prng( sprng ) % 17 + 5;    values 0-16 + 5 = 5-21
    403 //   prng( sprng, 16 + 1 ) + 5;
    404 //   prng( sprng, 5, 21 );
    405 //   calls( sprng );
    406 
    407388struct PRNG {
    408389        uint32_t callcnt;                                                                       // call count
     
    411392}; // PRNG
    412393
    413 void set_seed( PRNG & prng, uint32_t seed_ );
    414394uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]
    415395static inline {
     396        void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; } // set seed
    416397        void ?{}( PRNG & prng ) { set_seed( prng, rdtscl() ); } // random seed
    417398        void ?{}( PRNG & prng, uint32_t seed ) { set_seed( prng, seed ); } // fixed seed
     
    422403} // distribution
    423404
    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 seed
    428 //   get_seed() - read seed
    429 //   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-21
    434 //   prng() % 17 + 5;   values 0-16 + 5 = 5-21
    435 //   prng( 16 + 1 ) + 5;
    436 //   prng( 5, 21 );
    437 
    438405void set_seed( uint32_t seed_ ) OPTIONAL_THREAD;
    439406uint32_t get_seed() __attribute__(( warn_unused_result ));
Note: See TracChangeset for help on using the changeset viewer.