/* * randomtest.C: brief test program for 32-bit and 64-bit output of SFMT. * * @author Mutsuo Saito (Hiroshima-univ) * * Copyright © 2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima * University. All rights reserved. * * The new BSD License is applied to this software, see doc/poddoc/license.pod */ #include "unit/test.h" #ifndef TIMING #define TIMING 0 #endif #ifndef VERBOSE #define VERBOSE 0 #endif #define BLOCK_SIZE 100000 #define BLOCK_SIZE64 50000 #define COUNT 1000 #if defined(HAVE_ALTIVEC) static vector unsigned int array1[BLOCK_SIZE / 4]; static vector unsigned int array2[10000 / 4]; #elif defined(HAVE_SSE2) static __m128i array1[BLOCK_SIZE / 4]; static __m128i array2[10000 / 4]; #else static uint64_t array1[BLOCK_SIZE / 4][2]; static uint64_t array2[10000 / 4][2]; #endif #ifndef ONLY64 test<1> (void) { int i; uint32_t *array32 = reinterpret_cast (array1); uint32_t *array32_2 = reinterpret_cast (array2); uint32_t ini[4] = { 0x1234, 0x5678, 0x9abc, 0xdef0 }; uint32_t r32; if (get_min_array_size32 () > 10000) { #if VERBOSE printf ("array size too small!\n"); #endif exit (1); } #if VERBOSE printf ("%s\n32 bit generated randoms\n", get_idstring ()); printf ("init_gen_rand__________\n"); #endif /* 32 bit generation */ init_gen_rand (1234); fill_array32 (array32, 10000); fill_array32 (array32_2, 10000); init_gen_rand (1234); for (i = 0; i < 10000; i++) { #if VERBOSE if (i < 1000) { printf ("%10u ", array32[i]); if (i % 5 == 4) { printf ("\n"); } } #endif r32 = gen_rand32 (); #if VERBOSE if (r32 != array32[i]) { printf ("\nmismatch at %d array32:%x gen:%x\n", i, array32[i], r32); exit (1); } #endif } for (i = 0; i < 700; i++) { r32 = gen_rand32 (); #if VERBOSE if (r32 != array32_2[i]) { printf ("\nmismatch at %d array32_2:%x gen:%x\n", i, array32_2[i], r32); exit (1); } #endif } #if VERBOSE printf ("\n"); #endif init_by_array (ini, 4); #if VERBOSE printf ("init_by_array__________\n"); #endif fill_array32 (array32, 10000); fill_array32 (array32_2, 10000); init_by_array (ini, 4); for (i = 0; i < 10000; i++) { #if VERBOSE if (i < 1000) { printf ("%10u ", array32[i]); if (i % 5 == 4) { printf ("\n"); } } #endif r32 = gen_rand32 (); if (r32 != array32[i]) { #if VERBOSE printf ("\nmismatch at %d array32:%x gen:%x\n", i, array32[i], r32); #endif exit (1); } } for (i = 0; i < 700; i++) { r32 = gen_rand32 (); if (r32 != array32_2[i]) { #if VERBOSE printf ("\nmismatch at %d array32_2:%x gen:%x\n", i, array32_2[i], r32); #endif exit (1); } } } #if TIMING test<2> (void) { int i, j; clock_t clo; clock_t min = LONG_MAX; uint32_t *array32 = static_cast (array1); if (get_min_array_size32 () > BLOCK_SIZE) { #if VERBOSE printf ("array size too small!\n"); #endif exit (1); } /* 32 bit generation */ init_gen_rand (1234); for (i = 0; i < 10; i++) { clo = clock (); for (j = 0; j < COUNT; j++) { fill_array32 (array32, BLOCK_SIZE); } clo = clock () - clo; if (clo < min) { min = clo; } } #if VERBOSE printf ("32 bit BLOCK:%.0f", (double) min * 1000 / CLOCKS_PER_SEC); printf ("ms for %u randoms generation\n", BLOCK_SIZE * COUNT); #endif min = LONG_MAX; init_gen_rand (1234); for (i = 0; i < 10; i++) { clo = clock (); for (j = 0; j < BLOCK_SIZE * COUNT; j++) { gen_rand32 (); } clo = clock () - clo; if (clo < min) { min = clo; } } #if VERBOSE printf ("32 bit SEQUE:%.0f", (double) min * 1000 / CLOCKS_PER_SEC); printf ("ms for %u randoms generation\n", BLOCK_SIZE * COUNT); #endif } #else test<2> () { } #endif #endif test<3> (void) { int i; uint64_t *array64; uint64_t *array64_2; uint64_t r; uint32_t ini[] = { 5, 4, 3, 2, 1 }; array64 = reinterpret_cast (array1); array64_2 = reinterpret_cast (array2); if (get_min_array_size64 () > 5000) { #if VERBOSE printf ("array size too small!\n"); #endif exit (1); } #if VERBOSE printf ("%s\n64 bit generated randoms\n", get_idstring ()); printf ("init_gen_rand__________\n"); #endif /* 64 bit generation */ init_gen_rand (4321); fill_array64 (array64, 5000); fill_array64 (array64_2, 5000); init_gen_rand (4321); for (i = 0; i < 5000; i++) { if (i < 1000) { #if VERBOSE printf ("%20" PRIu64 " ", array64[i]); if (i % 3 == 2) { printf ("\n"); } #endif } r = gen_rand64 (); if (r != array64[i]) { #if VERBOSE printf ("\nmismatch at %d array64:%" PRIx64 " gen:%" PRIx64 "\n", i, array64[i], r); #endif exit (1); } } #if VERBOSE printf ("\n"); #endif for (i = 0; i < 700; i++) { r = gen_rand64 (); if (r != array64_2[i]) { #if VERBOSE printf ("\nmismatch at %d array64_2:%" PRIx64 " gen:%" PRIx64 "\n", i, array64_2[i], r); #endif exit (1); } } #if VERBOSE printf ("init_by_array__________\n"); #endif /* 64 bit generation */ init_by_array (ini, 5); fill_array64 (array64, 5000); fill_array64 (array64_2, 5000); init_by_array (ini, 5); for (i = 0; i < 5000; i++) { #if VERBOSE if (i < 1000) { printf ("%20" PRIu64 " ", array64[i]); if (i % 3 == 2) { printf ("\n"); } } #endif r = gen_rand64 (); if (r != array64[i]) { #if VERBOSE printf ("\nmismatch at %d array64:%" PRIx64 " gen:%" PRIx64 "\n", i, array64[i], r); #endif exit (1); } } #if VERBOSE printf ("\n"); #endif for (i = 0; i < 700; i++) { r = gen_rand64 (); if (r != array64_2[i]) { #if VERBOSE printf ("\nmismatch at %d array64_2:%" PRIx64 " gen:%" PRIx64 "\n", i, array64_2[i], r); #endif exit (1); } } } #if TIMING test<4> (void) { int i, j; uint64_t clo; uint64_t min = LONG_MAX; uint64_t *array64 = static_cast (array1); if (get_min_array_size64 () > BLOCK_SIZE64) { #if VERBOSE printf ("array size too small!\n"); #endif exit (1); } /* 64 bit generation */ init_gen_rand (1234); for (i = 0; i < 10; i++) { clo = clock (); for (j = 0; j < COUNT; j++) { fill_array64 (array64, BLOCK_SIZE64); } clo = clock () - clo; if (clo < min) { min = clo; } } #if VERBOSE printf ("64 bit BLOCK:%.0f", (double) min * 1000 / CLOCKS_PER_SEC); printf ("ms for %u randoms generation\n", BLOCK_SIZE64 * COUNT); #endif min = LONG_MAX; init_gen_rand (1234); for (i = 0; i < 10; i++) { clo = clock (); for (j = 0; j < BLOCK_SIZE64 * COUNT; j++) { gen_rand64 (); } clo = clock () - clo; if (clo < min) { min = clo; } } #if VERBOSE printf ("64 bit SEQUE:%.0f", (double) min * 1000 / CLOCKS_PER_SEC); printf ("ms for %u randoms generation\n", BLOCK_SIZE64 * COUNT); #endif } #else test<4> () { } #endif #include "unit/runtest.h"