/** * @file sample.c * * @brief sample jump using pre-computed jump polynomial. * * The jump polynomial used in this program was calculated like this:
$ ./calc-jump 10000 lcm.521.txt
jump polynomial:
61cfe6581dea7caf5009f3366e7ba5c81e78da9f2700af2ad3cddc005b1b542bf9295a1a81c7d41ebae4edd16780347d604da7b861074aa7abadbfb4a5cbf9ea0d6a65bbd
* This jump step is too small for actual use, just for check. * Use larger step for your application. */ /* * In this sample, jump polynomial is fixed, then DSFMT_MEXP should be fixed. */ #define DSFMT_MEXP 521 #include #include "dSFMT.h" #include "dSFMT-jump.h" /* * jump step is dSFMT internal state step, * for double, 2 * jump step numbers are skipped. */ static const int step = 2 * 2000; static const int size = 5; static const char * jump2000 = "19976402611e3971602315ac42c1362b69367b411" "1785f40aa0ab67ce3e41e8d60eb1f3b012ed9854d7b594094b4b58670b30b9b1ea18a" "dba31d715592b6595195e01d458"; static const char * jump8000 = "b615c968ff87afc24e13d91dc2c27737a396667f6e" "b2979039b0de4d622a169d4d0b8200d2ee3b86d5f4528573abb4e55330bb0f002d66b" "762f42956f74a38e1cb5dbee2c"; int main(int argc, char * argv[]) { uint32_t seed = 1234; dsfmt_t dsfmt[size]; dsfmt_t serial; uint32_t array[size * step]; /* set up initial position of six sfmt instances * sfmt[0]: position 0 -- 2000, jump, 10000 -- 12000 * sfmt[1]: position 2000 -- 4000, jump, 12000 -- 14000 * sfmt[2]: position 4000 -- 6000 * sfmt[3]: position 6000 -- 8000 * sfmt[4]: position 8000 -- 10000 */ dsfmt_init_gen_rand(&dsfmt[0], seed); for (int i = 1; i < size; i++) { dsfmt[i] = dsfmt[i - 1]; dSFMT_jump(&dsfmt[i], jump2000); } /* initialize serial generator */ dsfmt_init_gen_rand(&serial, seed); /* generate and compare with serial generation */ for (int i = 0; i < 10; i++) { /* simulating parallel generation */ for (int j = 0; j < step; j++) { array[j + 0 * step] = dsfmt_genrand_uint32(&dsfmt[0]); array[j + 1 * step] = dsfmt_genrand_uint32(&dsfmt[1]); array[j + 2 * step] = dsfmt_genrand_uint32(&dsfmt[2]); array[j + 3 * step] = dsfmt_genrand_uint32(&dsfmt[3]); array[j + 4 * step] = dsfmt_genrand_uint32(&dsfmt[4]); } /* checking */ printf("comparing with serial generation %d to %d", i * 10000, (i + 1) * 10000 -1); for (int j = 0; j < size * step; j++) { if (dsfmt_genrand_uint32(&serial) != array[j]) { printf("something wrong! i=%d, j=%d\n", i, j); return -1; } } printf(" OK\n"); /* simulating parallel jump */ dSFMT_jump(&dsfmt[0], jump8000); dSFMT_jump(&dsfmt[1], jump8000); dSFMT_jump(&dsfmt[2], jump8000); dSFMT_jump(&dsfmt[3], jump8000); dSFMT_jump(&dsfmt[4], jump8000); } return 0; }