Ignore:
Timestamp:
Jan 10, 2022, 5:43:42 PM (2 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
Children:
c52f033
Parents:
4177592f
Message:

second attempt at specialized PRNG

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/stdlib.cfa

    r4177592f r2210cfc  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jan  3 09:36:27 2022
    13 // Update Count     : 519
     12// Last Modified On : Mon Jan 10 17:07:21 2022
     13// Update Count     : 572
    1414//
    1515
    1616#include "stdlib.hfa"
     17//#include "concurrency/kernel/fwd.hfa"
     18#include "concurrency/invoke.h"                                                 // random_state
    1719
    1820//---------------------------------------
     
    221223//---------------------------------------
    222224
    223 static uint32_t seed = 0;                                                               // current seed
    224 static thread_local uint32_t state;                                             // random state
    225 
    226 void set_seed( uint32_t seed_ ) { state = seed = seed_; }
    227 uint32_t get_seed() { return seed; }
    228 
    229225#define GENERATOR LCG
    230226
    231227inline uint32_t MarsagliaXor( uint32_t & state ) {
    232         if ( unlikely( seed == 0 ) ) set_seed( rdtscl() );
    233         else if ( unlikely( state == 0 ) ) state = seed;
    234228        state ^= state << 6;
    235229        state ^= state >> 21;
     
    239233
    240234inline uint32_t LCG( uint32_t & state ) {                               // linear congruential generator
    241         if ( unlikely( seed == 0 ) ) set_seed( rdtscl() );
    242         else if ( unlikely( state == 0 ) ) state = seed;
    243235        return state = 36969 * (state & 65535) + (state >> 16); // 36969 is NOT prime!
    244236} // LCG
    245237
     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; }
    246242uint32_t prng( PRNG & prng ) with( prng ) { callcnt += 1; return GENERATOR( state ); }
    247243
    248 uint32_t prng( void ) { return GENERATOR( state ); }
     244uint32_t prng( void ) { return GENERATOR( __thread_seed ); } // [0,UINT_MAX]
    249245
    250246//---------------------------------------
Note: See TracChangeset for help on using the changeset viewer.