LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
rand_state.h 文件参考
#include "../lmmp.h"
#include "../impl/longlong.h"
+ rand_state.h 的引用(Include)关系图:
+ 此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

结构体

struct  pcg64_128_state
 
struct  pcg64_le_seq_t
 
struct  xoshiro256pp_state
 

宏定义

#define INLINE_   static inline
 
#define PCG128_DEFAULT_MULTIPLIER_HI   0x2360ED051FC65DA4ULL
 
#define PCG128_DEFAULT_MULTIPLIER_LO   0x4385DF649FCCF645ULL
 
#define PCG64_LE_INCREMENT   1442695040888963407ULL
 
#define PCG64_LE_MULTIPLIER   6364136223846793005ULL
 
#define PRIME64_0   0x9E3779B185EBCA87ULL
 
#define PRIME64_1   0xC2B2AE3D27D4EB4FULL
 
#define PRIME64_2   0x165667B19E3779F9ULL
 
#define PRIME64_3   0x85EBCA77C2B2AE63ULL
 
#define PRIME64_4   0x27D4EB2F165667C5ULL
 

函数

static mp_limb_t lmmp_pcg64_128_random (pcg64_128_state *rng)
 
static void lmmp_pcg64_128_srandom (pcg64_128_state *rng, mp_limb_t seed)
 
static mp_limb_t lmmp_seed_generator (mp_limb_t seed)
 种子生成器
 
static mp_limb_t lmmp_xoshiro256pp_random (xoshiro256pp_state *rng)
 
static void lmmp_xoshiro256pp_srandom (xoshiro256pp_state *rng, mp_limb_t seed)
 
static void pcg64_128_action (mp_limb_t state[2], const mp_limb_t inc[2])
 
static mp_limb_t pcg64_le_action (mp_limb_t *restrict state)
 
static void pcg64_le_seq_init (pcg64_le_seq_t *rng, mp_size_t i, mp_limb_t seed)
 
static void pcg64_le_seq_next (mp_ptr restrict dst, mp_size_t n, pcg64_le_seq_t *rng)
 
static mp_limb_t rotl (const mp_limb_t x, int k)
 

结构体说明

◆ pcg64_128_state

struct pcg64_128_state

在文件 rand_state.h25 行定义.

+ pcg64_128_state 的协作图:
成员变量
mp_limb_t inc[2]
mp_limb_t state[2]

◆ pcg64_le_seq_t

struct pcg64_le_seq_t

在文件 rand_state.h133 行定义.

+ pcg64_le_seq_t 的协作图:
成员变量
mp_size_t k
mp_limb_t *restrict state

◆ xoshiro256pp_state

struct xoshiro256pp_state

在文件 rand_state.h30 行定义.

+ xoshiro256pp_state 的协作图:
成员变量
mp_limb_t s[4]

宏定义说明

◆ INLINE_

#define INLINE_   static inline

在文件 rand_state.h38 行定义.

◆ PCG128_DEFAULT_MULTIPLIER_HI

#define PCG128_DEFAULT_MULTIPLIER_HI   0x2360ED051FC65DA4ULL

在文件 rand_state.h34 行定义.

◆ PCG128_DEFAULT_MULTIPLIER_LO

#define PCG128_DEFAULT_MULTIPLIER_LO   0x4385DF649FCCF645ULL

在文件 rand_state.h35 行定义.

◆ PCG64_LE_INCREMENT

#define PCG64_LE_INCREMENT   1442695040888963407ULL

在文件 rand_state.h131 行定义.

◆ PCG64_LE_MULTIPLIER

#define PCG64_LE_MULTIPLIER   6364136223846793005ULL

在文件 rand_state.h130 行定义.

◆ PRIME64_0

#define PRIME64_0   0x9E3779B185EBCA87ULL

◆ PRIME64_1

#define PRIME64_1   0xC2B2AE3D27D4EB4FULL

◆ PRIME64_2

#define PRIME64_2   0x165667B19E3779F9ULL

◆ PRIME64_3

#define PRIME64_3   0x85EBCA77C2B2AE63ULL

◆ PRIME64_4

#define PRIME64_4   0x27D4EB2F165667C5ULL

函数说明

◆ lmmp_pcg64_128_random()

static mp_limb_t lmmp_pcg64_128_random ( pcg64_128_state rng)
inlinestatic

在文件 rand_state.h77 行定义.

77 {
78 lmmp_param_assert(rng != NULL);
79 mp_limb_t oldstate[2] = {rng->state[0], rng->state[1]};
80 pcg64_128_action(rng->state, rng->inc);
81
82 // XSL-RR
83 mp_limb_t xsl = ((oldstate[1]) ^ oldstate[0]);
84
85 mp_byte_t rot = (mp_byte_t)(oldstate[1] >> 58);
86 return (xsl >> rot) | (xsl << ((-rot) & 63));
87}
uint8_t mp_byte_t
Definition lmmp.h:210
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
mp_limb_t state[2]
Definition rand_state.h:26
static void pcg64_128_action(mp_limb_t state[2], const mp_limb_t inc[2])
Definition rand_state.h:53
mp_limb_t inc[2]
Definition rand_state.h:27

引用了 pcg64_128_state::inc, lmmp_param_assert, pcg64_128_action() , 以及 pcg64_128_state::state.

被这些函数引用 lmmp_seed_random_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_pcg64_128_srandom()

static void lmmp_pcg64_128_srandom ( pcg64_128_state rng,
mp_limb_t  seed 
)
inlinestatic

在文件 rand_state.h62 行定义.

62 {
63 lmmp_param_assert(rng != NULL);
64
65 rng->state[0] = lmmp_seed_generator(seed);
66 rng->state[1] = lmmp_seed_generator(seed << 17);
67 rng->inc[0] = lmmp_seed_generator(seed << 7);
68 rng->inc[0] |= 1ull;
69 rng->inc[1] = lmmp_seed_generator(seed << 21);
70
71 // warm up
72 pcg64_128_action(rng->state, rng->inc);
73 pcg64_128_action(rng->state, rng->inc);
74}
static mp_limb_t lmmp_seed_generator(mp_limb_t seed)
种子生成器
Definition rand_state.h:46

引用了 pcg64_128_state::inc, lmmp_param_assert, lmmp_seed_generator(), pcg64_128_action() , 以及 pcg64_128_state::state.

被这些函数引用 lmmp_seed_random_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_seed_generator()

static mp_limb_t lmmp_seed_generator ( mp_limb_t  seed)
inlinestatic

种子生成器

参数
seed低熵种子
返回
高熵种子

在文件 rand_state.h46 行定义.

46 {
47 mp_limb_t z = (seed += 0x9e3779b97f4a7c15);
48 z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
49 z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
50 return z ^ (z >> 31);
51}

被这些函数引用 lmmp_global_rng_init_(), lmmp_pcg64_128_srandom(), lmmp_random_(), lmmp_strong_rng_extern_(), lmmp_strong_rng_init_(), lmmp_xoshiro256pp_srandom(), pcg64_le_seq_init() , 以及 pcg64_le_seq_next().

+ 这是这个函数的调用关系图:

◆ lmmp_xoshiro256pp_random()

static mp_limb_t lmmp_xoshiro256pp_random ( xoshiro256pp_state rng)
inlinestatic

在文件 rand_state.h94 行定义.

94 {
95 lmmp_param_assert(rng != NULL);
96 const mp_limb_t r = rotl(rng->s[0] + rng->s[3], 23) + rng->s[0];
97 const mp_limb_t t = rng->s[1] << 17;
98
99 rng->s[2] ^= rng->s[0];
100 rng->s[3] ^= rng->s[1];
101 rng->s[1] ^= rng->s[2];
102 rng->s[0] ^= rng->s[3];
103 rng->s[2] ^= t;
104 rng->s[3] = rotl(rng->s[3], 45);
105
106 return r;
107}
static mp_limb_t rotl(const mp_limb_t x, int k)
Definition rand_state.h:89
mp_limb_t s[4]
Definition rand_state.h:31

引用了 lmmp_param_assert, rotl() , 以及 xoshiro256pp_state::s.

被这些函数引用 lmmp_seed_random_() , 以及 lmmp_xoshiro256pp_srandom().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_xoshiro256pp_srandom()

static void lmmp_xoshiro256pp_srandom ( xoshiro256pp_state rng,
mp_limb_t  seed 
)
inlinestatic

在文件 rand_state.h109 行定义.

109 {
110 lmmp_param_assert(rng != NULL);
111
112 rng->s[0] = lmmp_seed_generator(seed);
113 rng->s[1] = lmmp_seed_generator(seed << 17);
114 rng->s[2] = lmmp_seed_generator(0x9e37b97f8a5a7c19ULL ^ seed);
115 rng->s[3] = lmmp_seed_generator(0x8a07e6c7f6b9c92eULL ^ seed);
116
117 // assert that the initial state is non-zero
118 if (rng->s[0] == 0 && rng->s[1] == 0 && rng->s[2] == 0 && rng->s[3] == 0) {
119 rng->s[0] = 0xa12ef3383a3d2eefULL + seed;
120 rng->s[1] = 0xcdfabe82ecd412ceULL + seed;
121 rng->s[2] = 0x90b5ec55c9235815ULL + seed;
122 rng->s[3] = 0xcfb28093ca79a3a7ULL + seed;
123 }
124 // warm up
128}
static mp_limb_t lmmp_xoshiro256pp_random(xoshiro256pp_state *rng)
Definition rand_state.h:94

引用了 lmmp_param_assert, lmmp_seed_generator(), lmmp_xoshiro256pp_random() , 以及 xoshiro256pp_state::s.

被这些函数引用 lmmp_seed_random_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ pcg64_128_action()

static void pcg64_128_action ( mp_limb_t  state[2],
const mp_limb_t  inc[2] 
)
inlinestatic

在文件 rand_state.h53 行定义.

53 {
54 // state = (state * PCG64_MULT + inc) mod 2^128
55 mp_limb_t tmp[2] = {0, 0};
56 _umul64to128_(state[0], PCG128_DEFAULT_MULTIPLIER_LO, tmp, tmp + 1);
57 tmp[1] += state[1] * PCG128_DEFAULT_MULTIPLIER_LO;
58 tmp[1] += state[0] * PCG128_DEFAULT_MULTIPLIER_HI;
59 _u128add(state, tmp, inc);
60}
#define _u128add(r, x, y)
Definition longlong.h:260
static void _umul64to128_(uint64_t a, uint64_t b, uint64_t *low, uint64_t *high)
Definition longlong.h:31
#define PCG128_DEFAULT_MULTIPLIER_HI
Definition rand_state.h:34
#define PCG128_DEFAULT_MULTIPLIER_LO
Definition rand_state.h:35

引用了 _u128add, _umul64to128_(), PCG128_DEFAULT_MULTIPLIER_HI , 以及 PCG128_DEFAULT_MULTIPLIER_LO.

被这些函数引用 lmmp_pcg64_128_random() , 以及 lmmp_pcg64_128_srandom().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ pcg64_le_action()

static mp_limb_t pcg64_le_action ( mp_limb_t *restrict  state)
inlinestatic

在文件 rand_state.h178 行定义.

178 {
179 mp_limb_t old_state = *state;
180 *state = old_state * PCG64_LE_MULTIPLIER + PCG64_LE_INCREMENT;
181
182 // RXS-M-XS
183 mp_limb_t x = old_state;
184 int count = x >> 59;
185 x ^= x >> (5 + count);
186 x *= 12605985483714917081ULL;
187 x ^= x >> 43;
188
189 return x;
190}
#define PCG64_LE_INCREMENT
Definition rand_state.h:131
#define PCG64_LE_MULTIPLIER
Definition rand_state.h:130

引用了 PCG64_LE_INCREMENT , 以及 PCG64_LE_MULTIPLIER.

被这些函数引用 pcg64_le_seq_next().

+ 这是这个函数的调用关系图:

◆ pcg64_le_seq_init()

static void pcg64_le_seq_init ( pcg64_le_seq_t rng,
mp_size_t  i,
mp_limb_t  seed 
)
inlinestatic

在文件 rand_state.h138 行定义.

138 {
139 lmmp_param_assert(rng != NULL);
140 lmmp_param_assert(rng->k > 0);
141 lmmp_param_assert(rng->state != NULL);
142
143#define PRIME64_0 0x9E3779B185EBCA87ULL
144#define PRIME64_1 0xC2B2AE3D27D4EB4FULL
145#define PRIME64_2 0x165667B19E3779F9ULL
146#define PRIME64_3 0x85EBCA77C2B2AE63ULL
147#define PRIME64_4 0x27D4EB2F165667C5ULL
148
149 mp_limb_t s0, s1, s2, s3;
150
151 for (; i + 3 < rng->k; i += 4) {
152 s0 = rotl(seed + i + 0, 41);
153 s1 = rotl(seed + i + 1, 29);
154 s2 = rotl(seed + i + 2, 23);
155 s3 = rotl(seed + i + 3, 7);
156 s0 *= PRIME64_0;
157 s1 *= PRIME64_1;
158 s2 *= PRIME64_2;
159 s3 *= PRIME64_3;
160 rng->state[i + 0] = lmmp_seed_generator(s0 ^ rotl(s0, 17));
161 rng->state[i + 1] = lmmp_seed_generator(s1 ^ rotl(s1, 21));
162 rng->state[i + 2] = lmmp_seed_generator(s2 ^ rotl(s2, 13));
163 rng->state[i + 3] = lmmp_seed_generator(s3 ^ rotl(s3, 33));
164 }
165 for (; i < rng->k; i++) {
166 s0 = rotl(seed + i, 31);
167 s0 *= PRIME64_4;
168 rng->state[i] = lmmp_seed_generator(s0 ^ rotl(s0, 27));
169 }
170
171#undef PRIME64_0
172#undef PRIME64_1
173#undef PRIME64_2
174#undef PRIME64_3
175#undef PRIME64_4
176}
#define s1
#define s3
#define s2
mp_limb_t *restrict state
Definition rand_state.h:135
#define PRIME64_0
#define PRIME64_4
mp_size_t k
Definition rand_state.h:134
#define PRIME64_1
#define PRIME64_3
#define PRIME64_2

引用了 pcg64_le_seq_t::k, lmmp_param_assert, lmmp_seed_generator(), PRIME64_0, PRIME64_1, PRIME64_2, PRIME64_3, PRIME64_4, rotl(), s1, s2, s3 , 以及 pcg64_le_seq_t::state.

被这些函数引用 lmmp_strong_rng_extern_() , 以及 lmmp_strong_rng_init_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ pcg64_le_seq_next()

static void pcg64_le_seq_next ( mp_ptr restrict  dst,
mp_size_t  n,
pcg64_le_seq_t rng 
)
inlinestatic

在文件 rand_state.h192 行定义.

192 {
193 lmmp_param_assert(dst != NULL);
194 lmmp_param_assert(rng != NULL);
195 lmmp_param_assert(n <= rng->k);
196 mp_size_t i;
197 mp_limb_t mixn = lmmp_seed_generator(n * 0xb9ce52b55c72d585ULL);
198 for (i = 0; i + 3 < n; i += 4) {
199 dst[i + 0] = pcg64_le_action(&rng->state[i + 0]) ^ mixn;
200 dst[i + 1] = pcg64_le_action(&rng->state[i + 1]) ^ mixn;
201 dst[i + 2] = pcg64_le_action(&rng->state[i + 2]) ^ mixn;
202 dst[i + 3] = pcg64_le_action(&rng->state[i + 3]) ^ mixn;
203 }
204 for (; i < n; i++) {
205 dst[i] = pcg64_le_action(&rng->state[i]) ^ mixn;
206 }
207 for (; i < rng->k; i++) {
208 mp_limb_t old_state = rng->state[i];
209 rng->state[i] = old_state * PCG64_LE_MULTIPLIER + PCG64_LE_INCREMENT;
210 }
211}
#define k
uint64_t mp_size_t
Definition lmmp.h:212
static mp_limb_t pcg64_le_action(mp_limb_t *restrict state)
Definition rand_state.h:178

引用了 pcg64_le_seq_t::k, k, lmmp_param_assert, lmmp_seed_generator(), pcg64_le_action(), PCG64_LE_INCREMENT, PCG64_LE_MULTIPLIER , 以及 pcg64_le_seq_t::state.

被这些函数引用 lmmp_strong_random_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ rotl()

static mp_limb_t rotl ( const mp_limb_t  x,
int  k 
)
inlinestatic

在文件 rand_state.h89 行定义.

89 {
90 const int shift = k & 63;
91 return (x << shift) | (x >> (64 - shift));
92}

引用了 k.

被这些函数引用 lmmp_random_(), lmmp_strong_rng_extern_(), lmmp_strong_rng_init_(), lmmp_xoshiro256pp_random() , 以及 pcg64_le_seq_init().

+ 这是这个函数的调用关系图: