projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
zipf/pareto/gauss: hash cleanup
[fio.git]
/
lib
/
gauss.c
diff --git
a/lib/gauss.c
b/lib/gauss.c
index cd8b6e3e491a8669b3d5cad6e92c80567d656acb..f974490f72a512465a2ee3e534031418833da539 100644
(file)
--- a/
lib/gauss.c
+++ b/
lib/gauss.c
@@
-15,7
+15,7
@@
static int gauss_dev(struct gauss_state *gs)
return 0;
r = __rand(&gs->r);
return 0;
r = __rand(&gs->r);
- vr = gs->stddev * (r / (FRAND_MAX + 1.0));
+ vr = gs->stddev * (r / (FRAND
32
_MAX + 1.0));
return vr - gs->stddev / 2;
}
return vr - gs->stddev / 2;
}
@@
-38,16
+38,27
@@
unsigned long long gauss_next(struct gauss_state *gs)
sum += dev;
}
sum += dev;
}
- return __hash_u64(sum) % gs->nranges;
+ if (!gs->disable_hash)
+ sum = __hash_u64(sum);
+
+ return sum % gs->nranges;
}
}
-void gauss_init(struct gauss_state *gs, unsigned long nranges,
unsigned int d
,
+void gauss_init(struct gauss_state *gs, unsigned long nranges,
double dev
,
unsigned int seed)
{
memset(gs, 0, sizeof(*gs));
unsigned int seed)
{
memset(gs, 0, sizeof(*gs));
- init_rand_seed(&gs->r, seed);
+ init_rand_seed(&gs->r, seed
, 0
);
gs->nranges = nranges;
gs->nranges = nranges;
- gs->stddev = d;
- if (gs->stddev > nranges / 2)
- gs->stddev = nranges / 2;
+
+ if (dev != 0.0) {
+ gs->stddev = ceil((double) (nranges * 100.0) / dev);
+ if (gs->stddev > nranges / 2)
+ gs->stddev = nranges / 2;
+ }
+}
+
+void gauss_disable_hash(struct gauss_state *gs)
+{
+ gs->disable_hash = true;
}
}