32static inline unsigned int splitmix32(
const unsigned long seed)
36 unsigned long result = (seed ^ (seed >> 33)) * 0x62a9d9ed799705f5ul;
37 result = (result ^ (result >> 28)) * 0xcb24d0a5c88c35b3ul;
38 return (
unsigned int)(result >> 32);
43static inline unsigned rol32(
const unsigned int x,
const int k)
45 return (
x <<
k) | (
x >> (32 -
k));
53 const unsigned int result =
state[0] +
state[3];
54 const unsigned int t =
state[1] << 9;
64 return (
float)(result >> 8) * 0x1.0p-24f;
92 u1 = fmax(u1, FLT_MIN);
94 const float4
flip = { 1.0f, 0.0f, 1.0f, 0.0f };
95 const float4 flip_comp = { 0.0f, 1.0f, 0.0f, 0.0f };
98 const float4
noise =
flip * native_sqrt(-2.0f * native_log(u1)) * native_cos(2.f *
M_PI_F *
u2) +
99 flip_comp * native_sqrt(-2.0f * native_log(u1)) * native_sin(2.f *
M_PI_F *
u2);
117 u1 = fmax(u1, (float4)FLT_MIN);
119 const float4
flip = { 1.0f, 0.0f, 1.0f, 0.0f };
120 const float4 flip_comp = { 0.0f, 1.0f, 0.0f, 0.0f };
123 const float4
noise =
flip * native_sqrt(-2.0f * native_log(u1)) * native_cos(2.f *
M_PI_F *
u2) +
124 flip_comp * native_sqrt(-2.0f * native_log(u1)) * native_sin(2.f *
M_PI_F *
u2);
127 const float4
r =
noise *
sigma + 2.0f * native_sqrt(fmax(
mu + (3.f / 8.f), 0.0f));
133 const float4
mu,
const float4
param,
static float4 dt_noise_generator_simd(const dt_noise_distribution_t distribution, const float4 mu, const float4 param, uint state[4])
static unsigned rol32(const unsigned int x, const int k)
static unsigned int splitmix32(const unsigned long seed)
static float4 uniform_noise_simd(const float4 mu, const float4 sigma, uint state[4])
static float4 poisson_noise_simd(const float4 mu, const float4 sigma, uint state[4])
static float4 gaussian_noise_simd(const float4 mu, const float4 sigma, uint state[4])
static float xoshiro128plus(uint state[4])
float *const restrict const size_t k
const float uint32_t state[4]
const float const float param
const float const int flip