COSC-3P93-Project/Step 3/resources/opencl/randoms_git.cl

75 lines
2.3 KiB
Common Lisp
Raw Normal View History

2022-12-12 02:07:59 -05:00
/**
@file
Implements a 64-bit Permutated Congruential generator (PCG-XSH-RR).
M. E. ONeill, Pcg: A family of simple fast space-efficient statistically good algorithms for random number generation, ACM Transactions on Mathematical Software.
FROM: https://github.com/bstatcomp/RandomCL/blob/master/generators/pcg6432.cl
*/
#define RNG32
#define PCG6432_FLOAT_MULTI 2.3283064365386963e-10f
#define PCG6432_DOUBLE2_MULTI 2.3283064365386963e-10
#define PCG6432_DOUBLE_MULTI 5.4210108624275221700372640e-20
/**
State of pcg6432 RNG.
*/
typedef unsigned long pcg6432_state;
#define PCG6432_XORSHIFTED(s) ((uint)((((s) >> 18u) ^ (s)) >> 27u))
#define PCG6432_ROT(s) ((s) >> 59u)
#define pcg6432_macro_uint(state) ( \
state = state * 6364136223846793005UL + 0xda3e39cb94b95bdbUL, \
(PCG6432_XORSHIFTED(state) >> PCG6432_ROT(state)) | (PCG6432_XORSHIFTED(state) << ((-PCG6432_ROT(state)) & 31)) \
)
/**
Generates a random 32-bit unsigned integer using pcg6432 RNG.
@param state State of the RNG to use.
*/
#define pcg6432_uint(state) _pcg6432_uint(&state)
unsigned int _pcg6432_uint(pcg6432_state* state){
ulong oldstate = *state;
*state = oldstate * 6364136223846793005UL + 0xda3e39cb94b95bdbUL;
uint xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u;
uint rot = oldstate >> 59u;
return (xorshifted >> rot) | (xorshifted << ((-rot) & 31));
}
/**
Seeds pcg6432 RNG.
@param state Variable, that holds state of the generator to be seeded.
@param seed Value used for seeding. Should be randomly generated for each instance of generator (thread).
*/
void pcg6432_seed(pcg6432_state* state, unsigned long j){
*state=j;
}
/**
Generates a random 64-bit unsigned integer using pcg6432 RNG.
@param state State of the RNG to use.
*/
#define pcg6432_ulong(state) ((((ulong)pcg6432_uint(state)) << 32) | pcg6432_uint(state))
/**
Generates a random float using pcg6432 RNG.
@param state State of the RNG to use.
*/
#define pcg6432_float(state) (pcg6432_uint(state)*PCG6432_FLOAT_MULTI)
/**
Generates a random double using pcg6432 RNG.
@param state State of the RNG to use.
*/
#define pcg6432_double(state) (pcg6432_ulong(state)*PCG6432_DOUBLE_MULTI)
/**
Generates a random double using pcg6432 RNG. Generated using only 32 random bits.
@param state State of the RNG to use.
*/
#define pcg6432_double2(state) (pcg6432_uint(state)*PCG6432_DOUBLE2_MULTI)
/*
END OF SOURCED RANDOM GENERATOR
*/