From b1c7331483cc85cd5e9ae236c2b53f522b68416f Mon Sep 17 00:00:00 2001 From: AlexeyAB Date: Sat, 4 Jan 2020 15:43:55 +0300 Subject: [PATCH] Added fast random functions --- src/dropout_layer_kernels.cu | 8 +++--- src/utils.c | 51 +++++++++++++++++++++++++++++++++--- src/utils.h | 3 +++ 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/dropout_layer_kernels.cu b/src/dropout_layer_kernels.cu index 79ed37d9..09493bb0 100644 --- a/src/dropout_layer_kernels.cu +++ b/src/dropout_layer_kernels.cu @@ -59,12 +59,14 @@ void forward_dropout_layer_gpu(dropout_layer l, network_state state) for (k = 0; k < l.c; k++) { for (i = 0; i < max_blocks_per_channel; i++) { float rnd = random_float(); - //printf(" rnd = %f \n", rnd); + printf(" rnd = %f \n", rnd); + //int rn = rand_int_fast(1, 7); + //printf(" rnd = %d \n", rn); if (rnd < prob_place_block) { //count_ones += block_width *block_height; const int pre_index = k*l.w*l.h + b*l.w*l.h*l.c; - const int x_block = rand_int(0, l.w - block_width - 1); - const int y_block = rand_int(0, l.h - block_height - 1); + const int x_block = rand_int_fast(0, l.w - block_width - 1); + const int y_block = rand_int_fast(0, l.h - block_height - 1); for (y = y_block; y < (y_block + block_height); y++) { memset(&l.rand[x_block + y*l.w + pre_index], 1, block_width * sizeof(float)); //for (x = x_block; x < (x_block + block_width); x++) { diff --git a/src/utils.c b/src/utils.c index 4d8e439d..0e3a76fc 100644 --- a/src/utils.c +++ b/src/utils.c @@ -813,6 +813,40 @@ float **one_hot_encode(float *a, int n, int k) return t; } +static unsigned int x = 123456789, y = 362436069, z = 521288629; + +// Marsaglia's xorshf96 generator: period 2^96-1 +unsigned int random_gen_fast(void) +{ + unsigned int t; + x ^= x << 16; + x ^= x >> 5; + x ^= x << 1; + + t = x; + x = y; + y = z; + z = t ^ x ^ y; + + return z; +} + +float random_float_fast() +{ + return ((float)random_gen_fast() / (float)UINT_MAX); +} + +int rand_int_fast(int min, int max) +{ + if (max < min) { + int s = min; + min = max; + max = s; + } + int r = (random_gen_fast() % (max - min + 1)) + min; + return r; +} + unsigned int random_gen() { unsigned int rnd = 0; @@ -829,11 +863,20 @@ unsigned int random_gen() float random_float() { + unsigned int rnd = 0; #ifdef WIN32 - return ((float)random_gen() / (float)UINT_MAX); -#else - return ((float)random_gen() / (float)RAND_MAX); -#endif + rand_s(&rnd); + return ((float)rnd / (float)UINT_MAX); +#else // WIN32 + + rnd = rand(); +#if (RAND_MAX < 65536) + rnd = rand()*(RAND_MAX + 1) + rnd; + return((float)rnd / (float)(RAND_MAX*RAND_MAX)); +#endif //(RAND_MAX < 65536) + return ((float)rnd / (float)RAND_MAX); + +#endif // WIN32 } float rand_uniform_strong(float min, float max) diff --git a/src/utils.h b/src/utils.h index 421a313d..284e4556 100644 --- a/src/utils.h +++ b/src/utils.h @@ -73,6 +73,9 @@ char *find_char_arg(int argc, char **argv, char *arg, char *def); int sample_array(float *a, int n); int sample_array_custom(float *a, int n); void print_statistics(float *a, int n); +unsigned int random_gen_fast(void); +float random_float_fast(); +int rand_int_fast(int min, int max); unsigned int random_gen(); float random_float(); float rand_uniform_strong(float min, float max);