Added fast random functions

pull/1557/head
AlexeyAB 5 years ago
parent 0be40dbc92
commit b1c7331483
  1. 8
      src/dropout_layer_kernels.cu
  2. 51
      src/utils.c
  3. 3
      src/utils.h

@ -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++) {

@ -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)

@ -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);

Loading…
Cancel
Save