32 #ifndef VSMC_RNG_URNG_H
33 #define VSMC_RNG_URNG_H
176 #include <Random123/threefry.h>
177 #include <Random123/philox.h>
179 #define VSMC_DEFINE_RNG_URNG_RNG_T(RNG, N, W) \
181 RNG##N##x##W##_key_t key; \
182 RNG##N##x##W##_ctr_t ctr; \
183 RNG##N##x##W##_ctr_t rnd; \
184 unsigned char remain; \
185 } RNG##N##x##W##_rng_t;
187 #define VSMC_DEFINE_RNG_URNG_INIT(RNG, N, W) \
188 VSMC_STATIC_INLINE void RNG##N##x##W##_init( \
189 RNG##N##x##W##_rng_t *rng, uint##W##_t seed) \
191 RNG##N##x##W##_ctr_t init_ctr = {{}}; \
192 RNG##N##x##W##_ukey_t ukey = {{}}; \
193 rng->ctr = init_ctr; \
194 rng->rnd = init_ctr; \
196 rng->key = RNG##N##x##W##keyinit(ukey); \
200 #define VSMC_DEFINE_RNG_URNG_RAND(RNG, N, W) \
201 VSMC_STATIC_INLINE uint##W##_t RNG##N##x##W##_rand( \
202 RNG##N##x##W##_rng_t *rng) \
204 unsigned char remain = rng->remain; \
205 RNG##N##x##W##_ctr_t rnd = rng->rnd; \
209 rng->remain = remain; \
210 return rnd.v[remain]; \
213 RNG##N##x##W##_ctr_t ctr = rng->ctr; \
214 RNG##N##x##W##_key_t key = rng->key; \
218 rnd = RNG##N##x##W(ctr, key); \
220 rng->remain = remain; \
225 return rnd.v[remain]; \
282 #if VSMC_USE_PHILOX_CBURNG
292 #define cburng2x32_init philox2x32_init
293 #define cburng4x32_init philox4x32_init
295 #define cburng2x64_init philox2x64_init
297 #define cburng4x64_init philox4x64_init
299 #define cburng2x32_rand philox2x32_rand
301 #define cburng4x32_rand philox4x32_rand
303 #define cburng2x64_rand philox2x64_rand
305 #define cburng4x64_rand philox4x64_rand
307 #else // VSMC_USE_PHILOX_CBURNG
317 #define cburng2x32_init threefry2x32_init
318 #define cburng4x32_init threefry4x32_init
320 #define cburng2x64_init threefry2x64_init
322 #define cburng4x64_init threefry4x64_init
324 #define cburng2x32_rand threefry2x32_rand
326 #define cburng4x32_rand threefry4x32_rand
328 #define cburng2x64_rand threefry2x64_rand
330 #define cburng4x64_rand threefry4x64_rand
332 #endif // VSMC_USE_PHILOX_CBURNG
334 #endif // VSMC_RNG_URNG_H
#define VSMC_DEFINE_RNG_URNG_INIT(RNG, N, W)
threefry2x32_rng_t cburng2x32_rng_t
threefry4x64_rng_t cburng4x64_rng_t
threefry2x64_rng_t cburng2x64_rng_t
threefry4x32_rng_t cburng4x32_rng_t
#define VSMC_DEFINE_RNG_URNG_RNG_T(RNG, N, W)
#define VSMC_DEFINE_RNG_URNG_RAND(RNG, N, W)