1 |
#include <stdio.h> |
2 |
#include <stdlib.h> |
3 |
#include <limits.h> |
4 |
#include <time.h> |
5 |
#include <string.h> |
6 |
#define DSFMT_DO_NOT_USE_OLD_NAMES |
7 |
#include "dSFMT.h" |
8 |
|
9 |
#define NUM_RANDS 50000 |
10 |
#define TIC_MAG 1 |
11 |
#define TIC_COUNT 2000 |
12 |
|
13 |
w128_t dummy[NUM_RANDS / 2 + 1]; |
14 |
|
15 |
typedef double (*genrand_t)(void); |
16 |
typedef double (*st_genrand_t)(dsfmt_t *dsfmt); |
17 |
typedef void (*fill_array_t)(double array[], int size); |
18 |
typedef void (*st_fill_array_t)(dsfmt_t *dsfmt, double array[], int size); |
19 |
|
20 |
#ifdef __GNUC__ |
21 |
static void test_co(void) __attribute__((noinline)); |
22 |
static void test_oc(void) __attribute__((noinline)); |
23 |
static void test_oo(void) __attribute__((noinline)); |
24 |
static void test_12(void) __attribute__((noinline)); |
25 |
static void test_seq_co(void) __attribute__((noinline)); |
26 |
static void test_seq_oc(void) __attribute__((noinline)); |
27 |
static void test_seq_oo(void) __attribute__((noinline)); |
28 |
static void test_seq_12(void) __attribute__((noinline)); |
29 |
#else |
30 |
static void test_co(void); |
31 |
static void test_oc(void); |
32 |
static void test_oo(void); |
33 |
static void test_12(void); |
34 |
static void test_seq_co(void); |
35 |
static void test_seq_oc(void); |
36 |
static void test_seq_oo(void); |
37 |
static void test_seq_12(void); |
38 |
#endif |
39 |
static void check(char *start_mess, genrand_t genrand, fill_array_t fill_array, |
40 |
st_genrand_t st_genrand, st_fill_array_t st_fill_array, |
41 |
uint32_t seed, int n); |
42 |
static void check_ar(char *start_mess, genrand_t genrand, |
43 |
fill_array_t fill_array, |
44 |
st_genrand_t st_genrand, |
45 |
st_fill_array_t st_fill_array, |
46 |
int n); |
47 |
|
48 |
/* not inline wrapper functions for check() */ |
49 |
static double s_genrand_close_open(void) { |
50 |
return dsfmt_gv_genrand_close_open(); |
51 |
} |
52 |
static double s_genrand_open_close(void) { |
53 |
return dsfmt_gv_genrand_open_close(); |
54 |
} |
55 |
static double s_genrand_open_open(void) { |
56 |
return dsfmt_gv_genrand_open_open(); |
57 |
} |
58 |
static double s_genrand_close1_open2(void) { |
59 |
return dsfmt_gv_genrand_close1_open2(); |
60 |
} |
61 |
static double sst_genrand_close_open(dsfmt_t *dsfmt) { |
62 |
return dsfmt_genrand_close_open(dsfmt); |
63 |
} |
64 |
static double sst_genrand_open_close(dsfmt_t *dsfmt) { |
65 |
return dsfmt_genrand_open_close(dsfmt); |
66 |
} |
67 |
static double sst_genrand_open_open(dsfmt_t *dsfmt) { |
68 |
return dsfmt_genrand_open_open(dsfmt); |
69 |
} |
70 |
static double sst_genrand_close1_open2(dsfmt_t *dsfmt) { |
71 |
return dsfmt_genrand_close1_open2(dsfmt); |
72 |
} |
73 |
static void s_fill_array_close_open(double array[], int size) { |
74 |
dsfmt_gv_fill_array_close_open(array, size); |
75 |
} |
76 |
static void s_fill_array_open_close(double array[], int size) { |
77 |
dsfmt_gv_fill_array_open_close(array, size); |
78 |
} |
79 |
static void s_fill_array_open_open(double array[], int size) { |
80 |
dsfmt_gv_fill_array_open_open(array, size); |
81 |
} |
82 |
static void s_fill_array_close1_open2(double array[], int size) { |
83 |
dsfmt_gv_fill_array_close1_open2(array, size); |
84 |
} |
85 |
static void sst_fill_array_close_open(dsfmt_t *dsfmt, double array[], |
86 |
int size) { |
87 |
dsfmt_fill_array_close_open(dsfmt, array, size); |
88 |
} |
89 |
static void sst_fill_array_open_close(dsfmt_t *dsfmt, double array[], |
90 |
int size) { |
91 |
dsfmt_fill_array_open_close(dsfmt, array, size); |
92 |
} |
93 |
static void sst_fill_array_open_open(dsfmt_t *dsfmt, double array[], |
94 |
int size) { |
95 |
dsfmt_fill_array_open_open(dsfmt, array, size); |
96 |
} |
97 |
static void sst_fill_array_close1_open2(dsfmt_t *dsfmt, double array[], |
98 |
int size) { |
99 |
dsfmt_fill_array_close1_open2(dsfmt, array, size); |
100 |
} |
101 |
|
102 |
static void check(char *range_str, genrand_t genrand, fill_array_t fill_array, |
103 |
st_genrand_t st_genrand, st_fill_array_t st_fill_array, |
104 |
uint32_t seed, int print_size) { |
105 |
int i; |
106 |
union W64_T { |
107 |
uint64_t u; |
108 |
double d; |
109 |
}; |
110 |
w128_t little[DSFMT_N+1]; |
111 |
union W64_T *array = (union W64_T *)dummy; |
112 |
union W64_T *plittle = (union W64_T *)little; |
113 |
union W64_T r, r_st; |
114 |
int lsize = DSFMT_N * 2 + 2; |
115 |
dsfmt_t dsfmt; |
116 |
|
117 |
printf("generated randoms %s\n", range_str); |
118 |
dsfmt_gv_init_gen_rand(seed); |
119 |
fill_array(&plittle[0].d, lsize); |
120 |
fill_array(&array[0].d, 5000); |
121 |
dsfmt_gv_init_gen_rand(seed); |
122 |
dsfmt_init_gen_rand(&dsfmt, seed); |
123 |
for (i = 0; i < lsize; i++) { |
124 |
r.d = genrand(); |
125 |
r_st.d = st_genrand(&dsfmt); |
126 |
if (r.u != r_st.u || r.u != plittle[i].u) { |
127 |
printf("\n%s mismatch i = %d: r = %1.15f(%08"PRIx64"), " |
128 |
"st = %1.15f(%08"PRIx64")" |
129 |
"array = %1.15f(%08"PRIx64")\n", |
130 |
range_str, i, r.d, r.u, |
131 |
r_st.d, r_st.u, |
132 |
plittle[i].d, plittle[i].u); |
133 |
exit(1); |
134 |
} |
135 |
if (i < print_size) { |
136 |
printf("%1.15f ", plittle[i].d); |
137 |
if (i % 4 == 3) { |
138 |
printf("\n"); |
139 |
} |
140 |
} |
141 |
} |
142 |
for (i = 0; i < 5000; i++) { |
143 |
r.d = genrand(); |
144 |
if (r.u != array[i].u) { |
145 |
printf("\n%s mismatch i = %d: r = %1.15f(%08"PRIx64"), " |
146 |
"array = %1.15f(%08"PRIx64")\n", |
147 |
range_str, i + lsize, r.d, r.u, |
148 |
array[i].d, array[i].u); |
149 |
exit(1); |
150 |
} |
151 |
if (i + lsize < print_size) { |
152 |
printf("%1.15f ", array[i].d); |
153 |
if ((i + lsize) % 4 == 3) { |
154 |
printf("\n"); |
155 |
} |
156 |
} |
157 |
} |
158 |
|
159 |
dsfmt_init_gen_rand(&dsfmt, seed); |
160 |
st_fill_array(&dsfmt, &plittle[0].d, lsize); |
161 |
st_fill_array(&dsfmt, &array[0].d, 5000); |
162 |
dsfmt_init_gen_rand(&dsfmt, seed); |
163 |
for (i = 0; i < lsize; i++) { |
164 |
r_st.d = st_genrand(&dsfmt); |
165 |
if (r_st.u != plittle[i].u) { |
166 |
printf("\n%s mismatch i = %d: st = %1.15f(%08"PRIx64"), " |
167 |
"array = %1.15f(%08"PRIx64")\n", |
168 |
range_str, i, r_st.d, r_st.u, |
169 |
plittle[i].d, plittle[i].u); |
170 |
exit(1); |
171 |
} |
172 |
} |
173 |
for (i = 0; i < 5000; i++) { |
174 |
r_st.d = st_genrand(&dsfmt); |
175 |
if (r_st.u != array[i].u) { |
176 |
printf("\n%s mismatch i = %d: r = %1.15f(%08"PRIx64"), " |
177 |
"array = %1.15f(%08"PRIx64")\n", |
178 |
range_str, i + lsize, r_st.d, r_st.u, |
179 |
array[i].d, array[i].u); |
180 |
exit(1); |
181 |
} |
182 |
} |
183 |
} |
184 |
|
185 |
static void check_ar(char *range_str, genrand_t genrand, |
186 |
fill_array_t fill_array, |
187 |
st_genrand_t st_genrand, |
188 |
st_fill_array_t st_fill_array, |
189 |
int print_size) { |
190 |
int i; |
191 |
union W64_T { |
192 |
uint64_t u; |
193 |
double d; |
194 |
}; |
195 |
w128_t little[DSFMT_N+1]; |
196 |
union W64_T *array = (union W64_T *)dummy; |
197 |
union W64_T *plittle = (union W64_T *)little; |
198 |
union W64_T r, r_st; |
199 |
int lsize = DSFMT_N * 2 + 2; |
200 |
dsfmt_t dsfmt; |
201 |
uint32_t ar[4] = {1, 2, 3, 4}; |
202 |
|
203 |
printf("generated randoms %s\n", range_str); |
204 |
dsfmt_gv_init_by_array(ar, 4); |
205 |
fill_array(&plittle[0].d, lsize); |
206 |
fill_array(&array[0].d, 5000); |
207 |
dsfmt_gv_init_by_array(ar, 4); |
208 |
dsfmt_init_by_array(&dsfmt, ar, 4); |
209 |
for (i = 0; i < lsize; i++) { |
210 |
r.d = genrand(); |
211 |
r_st.d = st_genrand(&dsfmt); |
212 |
if (r.u != r_st.u || r.u != plittle[i].u) { |
213 |
printf("\n%s mismatch i = %d: r = %1.15f(%08"PRIx64"), " |
214 |
"st = %1.15f(%08"PRIx64")" |
215 |
"array = %1.15f(%08"PRIx64")\n", |
216 |
range_str, i, r.d, r.u, |
217 |
r_st.d, r_st.u, |
218 |
plittle[i].d, plittle[i].u); |
219 |
exit(1); |
220 |
} |
221 |
if (i < print_size) { |
222 |
printf("%1.15f ", plittle[i].d); |
223 |
if (i % 4 == 3) { |
224 |
printf("\n"); |
225 |
} |
226 |
} |
227 |
} |
228 |
for (i = 0; i < 5000; i++) { |
229 |
r.d = genrand(); |
230 |
if (r.u != array[i].u) { |
231 |
printf("\n%s mismatch i = %d: r = %1.15f(%08"PRIx64"), " |
232 |
"array = %1.15f(%08"PRIx64")\n", |
233 |
range_str, i + lsize, r.d, r.u, |
234 |
array[i].d, array[i].u); |
235 |
exit(1); |
236 |
} |
237 |
if (i + lsize < print_size) { |
238 |
printf("%1.15f ", array[i].d); |
239 |
if ((i + lsize) % 4 == 3) { |
240 |
printf("\n"); |
241 |
} |
242 |
} |
243 |
} |
244 |
|
245 |
dsfmt_init_by_array(&dsfmt, ar, 4); |
246 |
st_fill_array(&dsfmt, &plittle[0].d, lsize); |
247 |
st_fill_array(&dsfmt, &array[0].d, 5000); |
248 |
dsfmt_init_by_array(&dsfmt, ar, 4); |
249 |
for (i = 0; i < lsize; i++) { |
250 |
r_st.d = st_genrand(&dsfmt); |
251 |
if (r_st.u != plittle[i].u) { |
252 |
printf("\n%s mismatch i = %d: st = %1.15f(%08"PRIx64"), " |
253 |
"array = %1.15f(%08"PRIx64")\n", |
254 |
range_str, i, r_st.d, r_st.u, |
255 |
plittle[i].d, plittle[i].u); |
256 |
exit(1); |
257 |
} |
258 |
} |
259 |
for (i = 0; i < 5000; i++) { |
260 |
r_st.d = st_genrand(&dsfmt); |
261 |
if (r_st.u != array[i].u) { |
262 |
printf("\n%s mismatch i = %d: r = %1.15f(%08"PRIx64"), " |
263 |
"array = %1.15f(%08"PRIx64")\n", |
264 |
range_str, i + lsize, r_st.d, r_st.u, |
265 |
array[i].d, array[i].u); |
266 |
exit(1); |
267 |
} |
268 |
} |
269 |
} |
270 |
|
271 |
static void test_co(void) { |
272 |
uint32_t i, j; |
273 |
uint64_t clo; |
274 |
uint64_t sum; |
275 |
double *array = (double *)dummy; |
276 |
dsfmt_t dsfmt; |
277 |
|
278 |
#if 0 |
279 |
dsfmt_gv_init_gen_rand(1234); |
280 |
sum = 0; |
281 |
for (i = 0; i < 10; i++) { |
282 |
clo = clock(); |
283 |
for (j = 0; j < TIC_COUNT; j++) { |
284 |
dsfmt_gv_fill_array_close_open(array, NUM_RANDS); |
285 |
} |
286 |
clo = clock() - clo; |
287 |
sum += clo; |
288 |
} |
289 |
printf("GL BLOCK [0, 1) AVE:%4"PRIu64"ms.\n", |
290 |
(sum * 100) / CLOCKS_PER_SEC); |
291 |
#endif |
292 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
293 |
sum = 0; |
294 |
for (i = 0; i < 10; i++) { |
295 |
clo = clock(); |
296 |
for (j = 0; j < TIC_COUNT; j++) { |
297 |
dsfmt_fill_array_close_open(&dsfmt, array, NUM_RANDS); |
298 |
} |
299 |
clo = clock() - clo; |
300 |
sum += clo; |
301 |
} |
302 |
printf("ST BLOCK [0, 1) AVE:%4"PRIu64"ms.\n", |
303 |
(sum * 100) / CLOCKS_PER_SEC); |
304 |
} |
305 |
|
306 |
static void test_oc(void) { |
307 |
uint32_t i, j; |
308 |
uint64_t clo; |
309 |
uint64_t sum; |
310 |
double *array = (double *)dummy; |
311 |
dsfmt_t dsfmt; |
312 |
#if 0 |
313 |
dsfmt_gv_init_gen_rand(1234); |
314 |
sum = 0; |
315 |
for (i = 0; i < 10; i++) { |
316 |
clo = clock(); |
317 |
for (j = 0; j < TIC_COUNT; j++) { |
318 |
dsfmt_gv_fill_array_open_close(array, NUM_RANDS); |
319 |
} |
320 |
clo = clock() - clo; |
321 |
sum += clo; |
322 |
} |
323 |
printf("GL BLOCK (0, 1] AVE:%4"PRIu64"ms.\n", |
324 |
(sum * 100) / CLOCKS_PER_SEC); |
325 |
#endif |
326 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
327 |
sum = 0; |
328 |
for (i = 0; i < 10; i++) { |
329 |
clo = clock(); |
330 |
for (j = 0; j < TIC_COUNT; j++) { |
331 |
dsfmt_fill_array_open_close(&dsfmt, array, NUM_RANDS); |
332 |
} |
333 |
clo = clock() - clo; |
334 |
sum += clo; |
335 |
} |
336 |
printf("ST BLOCK (0, 1] AVE:%4"PRIu64"ms.\n", |
337 |
(sum * 100) / CLOCKS_PER_SEC); |
338 |
} |
339 |
|
340 |
static void test_oo(void) { |
341 |
uint32_t i, j; |
342 |
uint64_t clo; |
343 |
uint64_t sum; |
344 |
double *array = (double *)dummy; |
345 |
dsfmt_t dsfmt; |
346 |
#if 0 |
347 |
dsfmt_gv_init_gen_rand(1234); |
348 |
sum = 0; |
349 |
for (i = 0; i < 10; i++) { |
350 |
clo = clock(); |
351 |
for (j = 0; j < TIC_COUNT; j++) { |
352 |
dsfmt_gv_fill_array_open_open(array, NUM_RANDS); |
353 |
} |
354 |
clo = clock() - clo; |
355 |
sum += clo; |
356 |
} |
357 |
printf("GL BLOCK (0, 1) AVE:%4"PRIu64"ms.\n", |
358 |
(sum * 100) / CLOCKS_PER_SEC); |
359 |
#endif |
360 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
361 |
sum = 0; |
362 |
for (i = 0; i < 10; i++) { |
363 |
clo = clock(); |
364 |
for (j = 0; j < TIC_COUNT; j++) { |
365 |
dsfmt_fill_array_open_open(&dsfmt, array, NUM_RANDS); |
366 |
} |
367 |
clo = clock() - clo; |
368 |
sum += clo; |
369 |
} |
370 |
printf("ST BLOCK (0, 1) AVE:%4"PRIu64"ms.\n", |
371 |
(sum * 100) / CLOCKS_PER_SEC); |
372 |
} |
373 |
|
374 |
static void test_12(void) { |
375 |
uint32_t i, j; |
376 |
uint64_t clo; |
377 |
uint64_t sum; |
378 |
double *array = (double *)dummy; |
379 |
dsfmt_t dsfmt; |
380 |
#if 0 |
381 |
dsfmt_gv_init_gen_rand(1234); |
382 |
sum = 0; |
383 |
for (i = 0; i < 10; i++) { |
384 |
clo = clock(); |
385 |
for (j = 0; j < TIC_COUNT; j++) { |
386 |
dsfmt_gv_fill_array_close1_open2(array, NUM_RANDS); |
387 |
} |
388 |
clo = clock() - clo; |
389 |
sum += clo; |
390 |
} |
391 |
printf("GL BLOCK [1, 2) AVE:%4"PRIu64"ms.\n", |
392 |
(sum * 100) / CLOCKS_PER_SEC); |
393 |
#endif |
394 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
395 |
sum = 0; |
396 |
for (i = 0; i < 10; i++) { |
397 |
clo = clock(); |
398 |
for (j = 0; j < TIC_COUNT; j++) { |
399 |
dsfmt_fill_array_close1_open2(&dsfmt, array, NUM_RANDS); |
400 |
} |
401 |
clo = clock() - clo; |
402 |
sum += clo; |
403 |
} |
404 |
printf("ST BLOCK [1, 2) AVE:%4"PRIu64"ms.\n", |
405 |
(sum * 100) / CLOCKS_PER_SEC); |
406 |
} |
407 |
|
408 |
static void test_seq_co(void) { |
409 |
uint32_t i, j, k; |
410 |
uint64_t clo; |
411 |
uint64_t sum; |
412 |
double *array = (double *)dummy; |
413 |
double r; |
414 |
double total = 0; |
415 |
dsfmt_t dsfmt; |
416 |
#if 0 |
417 |
dsfmt_gv_init_gen_rand(1234); |
418 |
sum = 0; |
419 |
r = 0; |
420 |
for (i = 0; i < 10; i++) { |
421 |
clo = clock(); |
422 |
for (j = 0; j < TIC_COUNT; j++) { |
423 |
for (k = 0; k < NUM_RANDS; k++) { |
424 |
r += dsfmt_gv_genrand_close_open(); |
425 |
} |
426 |
} |
427 |
clo = clock() - clo; |
428 |
sum += clo; |
429 |
} |
430 |
total = r; |
431 |
printf("GL SEQ [0, 1) 1 AVE:%4"PRIu64"ms.\n", |
432 |
(sum * 100) / CLOCKS_PER_SEC); |
433 |
|
434 |
sum = 0; |
435 |
for (i = 0; i < 10; i++) { |
436 |
clo = clock(); |
437 |
for (j = 0; j < TIC_COUNT; j++) { |
438 |
for (k = 0; k < NUM_RANDS; k++) { |
439 |
array[k] = dsfmt_gv_genrand_close_open(); |
440 |
} |
441 |
} |
442 |
clo = clock() - clo; |
443 |
sum += clo; |
444 |
} |
445 |
for (k = 0; k < NUM_RANDS; k++) { |
446 |
total += array[k]; |
447 |
} |
448 |
printf("GL SEQ [0, 1) 2 AVE:%4"PRIu64"ms.\n", |
449 |
(sum * 100) / CLOCKS_PER_SEC); |
450 |
#endif |
451 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
452 |
sum = 0; |
453 |
r = 0; |
454 |
for (i = 0; i < 10; i++) { |
455 |
clo = clock(); |
456 |
for (j = 0; j < TIC_COUNT; j++) { |
457 |
for (k = 0; k < NUM_RANDS; k++) { |
458 |
r += dsfmt_genrand_close_open(&dsfmt); |
459 |
} |
460 |
} |
461 |
clo = clock() - clo; |
462 |
sum += clo; |
463 |
} |
464 |
total = r; |
465 |
printf("ST SEQ [0, 1) 1 AVE:%4"PRIu64"ms.\n", |
466 |
(sum * 100) / CLOCKS_PER_SEC); |
467 |
|
468 |
sum = 0; |
469 |
for (i = 0; i < 10; i++) { |
470 |
clo = clock(); |
471 |
for (j = 0; j < TIC_COUNT; j++) { |
472 |
for (k = 0; k < NUM_RANDS; k++) { |
473 |
array[k] = dsfmt_genrand_close_open(&dsfmt); |
474 |
} |
475 |
} |
476 |
clo = clock() - clo; |
477 |
sum += clo; |
478 |
} |
479 |
for (k = 0; k < NUM_RANDS; k++) { |
480 |
total += array[k]; |
481 |
} |
482 |
printf("ST SEQ [0, 1) 2 AVE:%4"PRIu64"ms.\n", |
483 |
(sum * 100) / CLOCKS_PER_SEC); |
484 |
|
485 |
printf("total = %f\n", total); |
486 |
} |
487 |
|
488 |
static void test_seq_oc(void) { |
489 |
uint32_t i, j, k; |
490 |
uint64_t clo; |
491 |
uint64_t sum; |
492 |
double *array = (double *)dummy; |
493 |
double r; |
494 |
double total = 0; |
495 |
dsfmt_t dsfmt; |
496 |
#if 0 |
497 |
dsfmt_gv_init_gen_rand(1234); |
498 |
sum = 0; |
499 |
r = 0; |
500 |
for (i = 0; i < 10; i++) { |
501 |
clo = clock(); |
502 |
for (j = 0; j < TIC_COUNT; j++) { |
503 |
for (k = 0; k < NUM_RANDS; k++) { |
504 |
r += dsfmt_gv_genrand_open_close(); |
505 |
} |
506 |
} |
507 |
clo = clock() - clo; |
508 |
sum += clo; |
509 |
} |
510 |
total = r; |
511 |
printf("GL SEQ (0, 1] 1 AVE:%4"PRIu64"ms.\n", |
512 |
(sum * 100) / CLOCKS_PER_SEC); |
513 |
sum = 0; |
514 |
for (i = 0; i < 10; i++) { |
515 |
clo = clock(); |
516 |
for (j = 0; j < TIC_COUNT; j++) { |
517 |
for (k = 0; k < NUM_RANDS; k++) { |
518 |
array[k] = dsfmt_gv_genrand_open_close(); |
519 |
} |
520 |
} |
521 |
clo = clock() - clo; |
522 |
sum += clo; |
523 |
} |
524 |
for (k = 0; k < NUM_RANDS; k++) { |
525 |
total += array[k]; |
526 |
} |
527 |
printf("GL SEQ (0, 1] 2 AVE:%4"PRIu64"ms.\n", |
528 |
(sum * 100) / CLOCKS_PER_SEC); |
529 |
#endif |
530 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
531 |
sum = 0; |
532 |
r = 0; |
533 |
for (i = 0; i < 10; i++) { |
534 |
clo = clock(); |
535 |
for (j = 0; j < TIC_COUNT; j++) { |
536 |
for (k = 0; k < NUM_RANDS; k++) { |
537 |
r += dsfmt_genrand_open_close(&dsfmt); |
538 |
} |
539 |
} |
540 |
clo = clock() - clo; |
541 |
sum += clo; |
542 |
} |
543 |
total += r; |
544 |
printf("ST SEQ (0, 1] 1 AVE:%4"PRIu64"ms.\n", |
545 |
(sum * 100) / CLOCKS_PER_SEC); |
546 |
sum = 0; |
547 |
for (i = 0; i < 10; i++) { |
548 |
clo = clock(); |
549 |
for (j = 0; j < TIC_COUNT; j++) { |
550 |
for (k = 0; k < NUM_RANDS; k++) { |
551 |
array[k] = dsfmt_genrand_open_close(&dsfmt); |
552 |
} |
553 |
} |
554 |
clo = clock() - clo; |
555 |
sum += clo; |
556 |
} |
557 |
for (k = 0; k < NUM_RANDS; k++) { |
558 |
total += array[k]; |
559 |
} |
560 |
printf("ST SEQ (0, 1] 2 AVE:%4"PRIu64"ms.\n", |
561 |
(sum * 100) / CLOCKS_PER_SEC); |
562 |
printf("total = %f\n", total); |
563 |
} |
564 |
|
565 |
static void test_seq_oo(void) { |
566 |
uint32_t i, j, k; |
567 |
uint64_t clo; |
568 |
uint64_t sum; |
569 |
double *array = (double *)dummy; |
570 |
double r; |
571 |
double total = 0; |
572 |
dsfmt_t dsfmt; |
573 |
#if 0 |
574 |
dsfmt_gv_init_gen_rand(1234); |
575 |
sum = 0; |
576 |
r = 0; |
577 |
for (i = 0; i < 10; i++) { |
578 |
clo = clock(); |
579 |
for (j = 0; j < TIC_COUNT; j++) { |
580 |
for (k = 0; k < NUM_RANDS; k++) { |
581 |
r += dsfmt_gv_genrand_open_open(); |
582 |
} |
583 |
} |
584 |
clo = clock() - clo; |
585 |
sum += clo; |
586 |
} |
587 |
total = r; |
588 |
printf("GL SEQ (0, 1) 1 AVE:%4"PRIu64"ms.\n", |
589 |
(sum * 100) / CLOCKS_PER_SEC); |
590 |
sum = 0; |
591 |
for (i = 0; i < 10; i++) { |
592 |
clo = clock(); |
593 |
for (j = 0; j < TIC_COUNT; j++) { |
594 |
for (k = 0; k < NUM_RANDS; k++) { |
595 |
array[k] = dsfmt_gv_genrand_open_open(); |
596 |
} |
597 |
} |
598 |
clo = clock() - clo; |
599 |
sum += clo; |
600 |
} |
601 |
for (k = 0; k < NUM_RANDS; k++) { |
602 |
total += array[k]; |
603 |
} |
604 |
printf("GL SEQ (0, 1) 2 AVE:%4"PRIu64"ms.\n", |
605 |
(sum * 100) / CLOCKS_PER_SEC); |
606 |
#endif |
607 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
608 |
sum = 0; |
609 |
r = 0; |
610 |
for (i = 0; i < 10; i++) { |
611 |
clo = clock(); |
612 |
for (j = 0; j < TIC_COUNT; j++) { |
613 |
for (k = 0; k < NUM_RANDS; k++) { |
614 |
r += dsfmt_genrand_open_open(&dsfmt); |
615 |
} |
616 |
} |
617 |
clo = clock() - clo; |
618 |
sum += clo; |
619 |
} |
620 |
total += r; |
621 |
printf("ST SEQ (0, 1) 1 AVE:%4"PRIu64"ms.\n", |
622 |
(sum * 100) / CLOCKS_PER_SEC); |
623 |
sum = 0; |
624 |
for (i = 0; i < 10; i++) { |
625 |
clo = clock(); |
626 |
for (j = 0; j < TIC_COUNT; j++) { |
627 |
for (k = 0; k < NUM_RANDS; k++) { |
628 |
array[k] = dsfmt_genrand_open_open(&dsfmt); |
629 |
} |
630 |
} |
631 |
clo = clock() - clo; |
632 |
sum += clo; |
633 |
} |
634 |
for (k = 0; k < NUM_RANDS; k++) { |
635 |
total += array[k]; |
636 |
} |
637 |
printf("ST SEQ (0, 1) 2 AVE:%4"PRIu64"ms.\n", |
638 |
(sum * 100) / CLOCKS_PER_SEC); |
639 |
printf("total = %f\n", total); |
640 |
} |
641 |
|
642 |
static void test_seq_12(void) { |
643 |
uint32_t i, j, k; |
644 |
uint64_t clo; |
645 |
uint64_t sum; |
646 |
double *array = (double *)dummy; |
647 |
double r; |
648 |
double total = 0; |
649 |
dsfmt_t dsfmt; |
650 |
#if 0 |
651 |
dsfmt_gv_init_gen_rand(1234); |
652 |
sum = 0; |
653 |
r = 0; |
654 |
for (i = 0; i < 10; i++) { |
655 |
clo = clock(); |
656 |
for (j = 0; j < TIC_COUNT; j++) { |
657 |
for (k = 0; k < NUM_RANDS; k++) { |
658 |
r += dsfmt_gv_genrand_close1_open2(); |
659 |
} |
660 |
} |
661 |
clo = clock() - clo; |
662 |
sum += clo; |
663 |
} |
664 |
total = r; |
665 |
printf("GL SEQ [1, 2) 1 AVE:%4"PRIu64"ms.\n", |
666 |
(sum * 100) / CLOCKS_PER_SEC); |
667 |
sum = 0; |
668 |
for (i = 0; i < 10; i++) { |
669 |
clo = clock(); |
670 |
for (j = 0; j < TIC_COUNT; j++) { |
671 |
for (k = 0; k < NUM_RANDS; k++) { |
672 |
array[k] = dsfmt_gv_genrand_close1_open2(); |
673 |
} |
674 |
} |
675 |
clo = clock() - clo; |
676 |
sum += clo; |
677 |
} |
678 |
for (k = 0; k < NUM_RANDS; k++) { |
679 |
total += array[k]; |
680 |
} |
681 |
printf("GL SEQ [1, 2) 2 AVE:%4"PRIu64"ms.\n", |
682 |
(sum * 100) / CLOCKS_PER_SEC); |
683 |
#endif |
684 |
dsfmt_init_gen_rand(&dsfmt, 1234); |
685 |
sum = 0; |
686 |
r = 0; |
687 |
for (i = 0; i < 10; i++) { |
688 |
clo = clock(); |
689 |
for (j = 0; j < TIC_COUNT; j++) { |
690 |
for (k = 0; k < NUM_RANDS; k++) { |
691 |
r += dsfmt_genrand_close1_open2(&dsfmt); |
692 |
} |
693 |
} |
694 |
clo = clock() - clo; |
695 |
sum += clo; |
696 |
} |
697 |
total += r; |
698 |
printf("ST SEQ [1, 2) 1 AVE:%4"PRIu64"ms.\n", |
699 |
(sum * 100) / CLOCKS_PER_SEC); |
700 |
sum = 0; |
701 |
for (i = 0; i < 10; i++) { |
702 |
clo = clock(); |
703 |
for (j = 0; j < TIC_COUNT; j++) { |
704 |
for (k = 0; k < NUM_RANDS; k++) { |
705 |
array[k] = dsfmt_genrand_close1_open2(&dsfmt); |
706 |
} |
707 |
} |
708 |
clo = clock() - clo; |
709 |
sum += clo; |
710 |
} |
711 |
for (k = 0; k < NUM_RANDS; k++) { |
712 |
total += array[k]; |
713 |
} |
714 |
printf("ST SEQ [1, 2) 2 AVE:%4"PRIu64"ms.\n", |
715 |
(sum * 100) / CLOCKS_PER_SEC); |
716 |
printf("total = %f\n", total); |
717 |
} |
718 |
|
719 |
int main(int argc, char *argv[]) { |
720 |
int i; |
721 |
|
722 |
if ((argc >= 2) && (strncmp(argv[1],"-s",2) == 0)) { |
723 |
printf("consumed time for generating %d randoms.\n", |
724 |
NUM_RANDS * TIC_COUNT); |
725 |
test_co(); |
726 |
test_oc(); |
727 |
test_oo(); |
728 |
test_12(); |
729 |
test_seq_co(); |
730 |
test_seq_oc(); |
731 |
test_seq_oo(); |
732 |
test_seq_12(); |
733 |
} else { |
734 |
printf("%s\n", dsfmt_get_idstring()); |
735 |
printf("init_gen_rand(0) "); |
736 |
check("[1, 2)", s_genrand_close1_open2, s_fill_array_close1_open2, |
737 |
sst_genrand_close1_open2, sst_fill_array_close1_open2, 0, 1000); |
738 |
for (i = 0; i < 20; i++) { |
739 |
printf("init_gen_rand(%d) ", i); |
740 |
switch (i % 4) { |
741 |
case 0: |
742 |
check("[0, 1)", s_genrand_close_open, s_fill_array_close_open, |
743 |
sst_genrand_close_open, sst_fill_array_close_open, i, 12); |
744 |
break; |
745 |
case 1: |
746 |
check("(0, 1]", s_genrand_open_close, s_fill_array_open_close, |
747 |
sst_genrand_open_close, sst_fill_array_open_close, i, 12); |
748 |
break; |
749 |
case 2: |
750 |
check("(0, 1)", s_genrand_open_open, s_fill_array_open_open, |
751 |
sst_genrand_open_open, sst_fill_array_open_open, i, 12); |
752 |
break; |
753 |
case 3: |
754 |
default: |
755 |
check("[1, 2)", s_genrand_close1_open2, |
756 |
s_fill_array_close1_open2, |
757 |
sst_genrand_close1_open2, |
758 |
sst_fill_array_close1_open2, i, 12); |
759 |
} |
760 |
} |
761 |
printf("init_by_array {1, 2, 3, 4} "); |
762 |
check_ar("[1, 2)", s_genrand_close1_open2, |
763 |
s_fill_array_close1_open2, |
764 |
sst_genrand_close1_open2, |
765 |
sst_fill_array_close1_open2, |
766 |
1000); |
767 |
} |
768 |
return 0; |
769 |
} |