diff --git a/src/benchmarks/zellularautomat/c/ca_common.c b/src/benchmarks/zellularautomat/c/ca_common.c index 73c129756e9750308ab2caf34b118b3a9877c6b8..b004ce8aeb2edde403a1e8424ed8759e7d7cd503 100644 --- a/src/benchmarks/zellularautomat/c/ca_common.c +++ b/src/benchmarks/zellularautomat/c/ca_common.c @@ -16,10 +16,6 @@ #include "openssl/evp.h" #include "ca_common.h" -#include "random.h" - -/* determine random integer between 0 and n-1 */ -#define randInt(n) ((int)(nextRandomLEcuyer() * n)) void ca_init(int argc, char** argv, int *lines, int *its) { @@ -36,18 +32,18 @@ void ca_init_config(line_t *buf, int lines, int skip_lines) { volatile int scratch; - initRandomLEcuyer(424243); + srand(424243); /* let the RNG spin for some rounds (used for distributed initialization) */ for (int y = 1; y <= skip_lines; y++) { for (int x = 1; x <= XSIZE; x++) { - scratch = scratch + randInt(100) >= 50; + scratch = scratch + (rand() % 2); } } for (int y = 1; y <= lines; y++) { for (int x = 1; x <= XSIZE; x++) { - buf[y][x] = randInt(100) >= 50; + buf[y][x] = rand() % 2; } } } diff --git a/src/benchmarks/zellularautomat/c/meson.build b/src/benchmarks/zellularautomat/c/meson.build index 4ff650e70fd0ad2125c578f27e36d0538bcd8e2f..056fd2cf6ef260624d1a802eb221264693de5a73 100644 --- a/src/benchmarks/zellularautomat/c/meson.build +++ b/src/benchmarks/zellularautomat/c/meson.build @@ -3,7 +3,6 @@ cc = meson.get_compiler('c') sources = [ 'ca_common.c', 'ca_openmp.c', - 'random.c', ] dependencies = [ diff --git a/src/benchmarks/zellularautomat/c/random.c b/src/benchmarks/zellularautomat/c/random.c deleted file mode 100644 index 2a186bcb4a8810e6140f949bcf3cd2f832af7963..0000000000000000000000000000000000000000 --- a/src/benchmarks/zellularautomat/c/random.c +++ /dev/null @@ -1,207 +0,0 @@ -#include "random.h" -/* (c) 1996,1997 Thomas Worsch, Peter Sanders */ -/* ===================================================================== - * The pseudo random number generator functions in this file are - * similar to those in - * Numerical Recipes in C, Second Edition, pages 279-282. - * - * The RNGs have names nextRandom<something> and they return a Float64. - * They are initialized by a call to initRandom<something> which - * take an Int32 as seed. - */ - -#define EPS 1.2e-7 -#define RNMX (1.0-EPS) -#define IM 2147483647 -#define AM ((Float64)1.0/IM) -#define IA 16807 -#define IQ 127773 -#define IR 2836 - -static Int32 state = 123456789; - -void initRandomParkMiller(Int32 seed) -{ - state = seed; - /* but we have to make sure that state never ever is set to zero */ - if (state==0) { state = 42; } -} - -Float64 nextRandomParkMiller(void) -{ - Int32 k; - Float64 result; - - k = state/IQ; - state = IA*(state-k*IQ)-k*IR; - if (state < 0) { state += IM; } - result = AM*state; - if (result >= 1.0) { result = RNMX; } - return result; -} - -/* ===================================================================== - * Now a pseudo RNG with a longer period (roughly 10^18) by lEcuyer - * (Numerical Recipes, page 282). - */ - -#define IM1 2147483563 -#define IM2 2147483399 -#define AM1 ((Float64)1.0/IM1) -#define IMM1 (IM1-1) -#define IA1 40014 -#define IA2 40692 -#define IQ1 53668 -#define IQ2 52774 -#define IR1 12211 -#define IR2 3791 - -#define NTAB 32 -#define NDIV (1+IMM1/NTAB) - -static Int32 state1 = 987654321; -static Int32 state2; -static Int32 y; -static Int32 v[NTAB]; - -/* ------------------------------------------------------------------ */ -static void initRandomSeedLEcuyer(Int32 seed) -{ - state1 = seed; - if (state1==0) { state1 = 987654321; } - state2 = state1; -} - -/* ------------------------------------------------------------------ */ -static void initRandomTabLEcuyer(void) -{ - Int32 j, k; - - for (j=NTAB+7; j>=0; j--) { - k = state1/IQ1; - state1 = IA1*(state1-k*IQ1)-k*IR1; - if (state1 < 0) { state1 += IM1; } - if (j < NTAB) { v[j] = state1; } - } - y = v[0]; -} - -/* ------------------------------------------------------------------ */ -void initRandomLEcuyer(Int32 seed) -{ - initRandomSeedLEcuyer(seed); - initRandomTabLEcuyer(); -} - -/* ------------------------------------------------------------------ */ -static Int32 power(Int32 base, Card64 exp, Int32 modulus) -{ - Int64 temp = 1; - Card64 mask; - - if (base < 0) { return 0; } - - /* note that at on each entry into the following loop body, the - actual value of temp is always positive and fits into an Int32 */ - for (mask = ((Card64)1) << 63; mask != 0; mask >>= 1) { - temp = (temp * temp) % modulus; - if (exp & mask) { - temp = (temp * base) % modulus; - } - } - return ((Int32) temp); -} - -/* ------------------------------------------------------------------ */ -static void forwardRandomLEcuyer(Card64 steps) -{ - Int32 a; - - a = power(IA1, steps, IM1); - state1 = (Int32) ( (((Int64)a) * state1) % IM1); - - a = power(IA2, steps, IM2); - state2 = (Int32) ( (((Int64)a) * state2) % IM2); -} - -/* ------------------------------------------------------------------ */ -/* - * The following initialization function is intended for use on a - * parallel machine. - * Each PE must call initParallelRandomLEcuyer once at the beginning. - * Calls to nextRandomLEcuyer will then return different (and hopefully - * pseudo unrelated) pseudo random numbers on different PEs. - * The calls to initParallelRandomLEcuyer on different PEs - * *MUST* *SATISFY* *THE* *FOLLOWING* *CONDITIONS*: - * - The parameter seed is the same on all PEs. - * - The parameter total is the same on all PEs and it must be - * the total number of PEs using the RNG. - * - The parameter pe must be different on each PE and for each - * i in the set {0,1,...,total-1} there must be exactly one PE - * calling initParallelRandomLEcuyer with parameter pe set to i. - * Please note: - * - There are *NO* run time checks to see whether the above - * conditions have been satisfied. - * - The numbers generated on different PEs are probably only more or - * less unrelated as long as the number of calls of nextRandomLEcuyer - * on each of the PEs is smaller than the period of the RNG - * (approx. 10^18) divided by the number of PEs (probably below 10^4). - * Since 10^14 calls of nextRandomLEcuyer will take quite some time, - * you are probably safe using this RNG. - * - This function uses nextRandomParkMiller. If you want to have - * reproducible results, make sure that you do not use - * RandomParkMiller yourself before calling initParallelRandomLEcuyer. - */ -void initParallelRandomLEcuyer(Int32 seed, Int32 pe, Int32 total) -{ - Card64 steps; - - initRandomSeedLEcuyer(seed); - - /* The period of the RNG is roughly 2.3e18, i.e. 2^61, - which should be distributed onto the PEs approximately equally; - because we do not know the exact value we are careful and take - one half of the average length of the interval per PE: */ - steps = (((Card64)1) << 60)/total; - - /* For PE number pe we get the starting point: */ - steps = steps * pe; - - /* Finally the starting point for each PE is randomly shifted - by an amount which is small compared to the length of - its interval (as long as there are much less than 2^30 PEs :-). - Therefore steps will still be far below the end of its interval: */ - steps = steps + (Card64) (nextRandomParkMiller() * (((Card64)1) << 30)); - - /* Now the RNG is initialized for PE pe as if it had already made steps - many steps from the initial seed. */ - forwardRandomLEcuyer(steps); - - initRandomTabLEcuyer(); -} - -/* ------------------------------------------------------------------ */ -Float64 nextRandomLEcuyer(void) -{ - Int32 k; - Float64 result; - int j; - - k = state1/IQ1; - state1 = IA1*(state1-k*IQ1)-k*IR1; - if (state1 < 0) { state1 += IM1; } - - k = state2/IQ2; - state2 = IA2*(state2-k*IQ2)-k*IR2; - if (state2 < 0) { state2 += IM2; } - - j = y/NDIV; - y = v[j] - state2; - v[j] = state1; - - if (y < 1) { y += IMM1; } - - result = AM1*y; - if (result >= 1.0) { result = RNMX; } - return result; -} diff --git a/src/benchmarks/zellularautomat/c/random.h b/src/benchmarks/zellularautomat/c/random.h deleted file mode 100644 index 8f4e67676704c0415a881bd3c27bb2a42ca3e032..0000000000000000000000000000000000000000 --- a/src/benchmarks/zellularautomat/c/random.h +++ /dev/null @@ -1,98 +0,0 @@ -#include <limits.h> -/* (c) 1996,1997 Thomas Worsch, Peter Sanders */ -/* ===================================================================== - * The pseudo random number generator functions in this file are - * similar to those in - * Numerical Recipes in C, Second Edition, pages 279-282. - * - * The RNGs have names nextRandom<something> and they return a Float64. - * They are initialized by a call to initRandom<something> which - * take an Int32 as seed. - */ - -/* C++ compatibility */ -#ifdef __cplusplus -#define CC extern "C" -#else -#define CC -#endif - -/* try to find out how 32 bit and 64 bit - * interger types look like in this compiler - * this may fail - * e.g., if the compiler does not support 64 data types... - */ -#if UINT_MAX >> 31 == 1 -typedef int Int32; -typedef unsigned int Card32; -#elif USHRT_MAX >> 31 == 1 -typedef short Int32; -typedef unsigned short Card32; -#elif ULONG_MAX >> 31 == 1 -typedef short Int32; -typedef unsigned short Card32; -#else /* provoke error */ -typedef nonexisting Int32; -typedef nonexisting Card32; -#endif - -#if UINT_MAX >> 63 == 1 -typedef int Int64; -typedef unsigned int Card64; -#elif ULONG_MAX >> 63 == 1 -typedef long Int64; -typedef unsigned long Card64; -#else -typedef long long int Int64; -typedef unsigned long long int Card64; -#endif - -typedef double Float64; - -/* ===================================================================== - * The Minimal Standard pseudo RNG (Numerical Recipes, page 279) - * by Park and Miller - * I added an initialization function and could therefore remove - * the MASK mechanism from the original ran0 function. - */ -CC void initRandomParkMiller(Int32 seed); -CC Float64 nextRandomParkMiller (void); - - -/* ===================================================================== - * Now a pseudo RNG with a longer period (roughly 10^18) by lEcuyer - * (Numerical Recipes, page 282). - */ -CC void initRandomLEcuyer(Int32 seed); -CC Float64 nextRandomLEcuyer (void); - - -/* ------------------------------------------------------------------ */ -/* - * The following initialization function is intended for use on a - * parallel machine. - * Each PE must call initParallelRandomLEcuyer once at the beginning. - * Calls to nextRandomLEcuyer will then return different (and hopefully - * pseudo unrelated) pseudo random numbers on different PEs. - * The calls to initParallelRandomLEcuyer on different PEs - * *MUST* *SATISFY* *THE* *FOLLOWING* *CONDITIONS*: - * - The parameter seed is the same on all PEs. - * - The parameter total is the same on all PEs and it must be - * the total number of PEs using the RNG. - * - The parameter pe must be different on each PE and for each - * i in the set {0,1,...,total-1} there must be exactly one PE - * calling initParallelRandomLEcuyer with parameter pe set to i. - * Please note: - * - There are *NO* run time checks to see whether the above - * conditions have been satisfied. - * - The numbers generated on different PEs are probably only more or - * less unrelated as long as the number of calls of nextRandomLEcuyer - * on each of the PEs is smaller than the period of the RNG - * (approx. 10^18) divided by the number of PEs (probably below 10^4). - * Since 10^14 calls of nextRandomLEcuyer will take quite some time, - * you are probably safe using this RNG. - * - This function uses nextRandomParkMiller. If you want to have - * reproducible results, make sure that you do not use - * RandomParkMiller yourself before calling initParallelRandomLEcuyer. - */ -CC void initParallelRandomLEcuyer(Int32 seed, Int32 pe, Int32 total);