Changeset: b0514875a835 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b0514875a835
Modified Files:
monetdb5/modules/kernel/microbenchmark.c
Branch: stratified_sampling
Log Message:
Use Mersenne Twister in microbenchmark (and fix formatting)
diffs (180 lines):
diff --git a/monetdb5/modules/kernel/microbenchmark.c
b/monetdb5/modules/kernel/microbenchmark.c
--- a/monetdb5/modules/kernel/microbenchmark.c
+++ b/monetdb5/modules/kernel/microbenchmark.c
@@ -21,9 +21,7 @@
#include <mal_exception.h>
#include "microbenchmark.h"
-#ifdef STATIC_CODE_ANALYSIS
-#define rand() 0
-#endif
+#include "mtwist.h"
static gdk_return
BATrandom(BAT **bn, oid *base, wrd *size, int *domain, int seed)
@@ -32,6 +30,7 @@ BATrandom(BAT **bn, oid *base, wrd *size
BUN i;
BAT *b = NULL;
int *restrict val;
+ mtwist *mt_rng;
if (*size > (wrd)BUN_MAX) {
GDKerror("BATrandom: size must not exceed BUN_MAX");
@@ -62,21 +61,19 @@ BATrandom(BAT **bn, oid *base, wrd *size
val = (int *) Tloc(b, BUNfirst(b));
/* create BUNs with random distribution */
+ mt_rng = mtwist_new();
+ mtwist_seed(mt_rng, seed);
+
if (seed != int_nil)
- srand(seed);
+ mtwist_seed(mt_rng, seed);
+
if (*domain == int_nil) {
- for (i = 0; i < n; i++) {
- val[i] = rand();
+ for (i = 0; i < n; i++) {
+ val[i] = mtwist_u32rand(mt_rng) % INT_MAX;
}
-#if RAND_MAX < 46340 /* 46340*46340 = 2147395600 < INT_MAX */
- } else if (*domain > RAND_MAX + 1) {
- for (i = 0; i < n; i++) {
- val[i] = (rand() * (RAND_MAX + 1) + rand()) % *domain;
- }
-#endif
} else {
- for (i = 0; i < n; i++) {
- val[i] = rand() % *domain;
+ for (i = 0; i < n; i++) {
+ val[i] = mtwist_u32rand(mt_rng) % *domain;
}
}
@@ -102,6 +99,8 @@ BATuniform(BAT **bn, oid *base, wrd *siz
BAT *b = NULL;
int *restrict val;
int v;
+ mtwist *mt_rng;
+
if (*size > (wrd)BUN_MAX) {
GDKerror("BATuniform: size must not exceed BUN_MAX");
@@ -132,15 +131,18 @@ BATuniform(BAT **bn, oid *base, wrd *siz
val = (int *) Tloc(b, BUNfirst(b));
/* create BUNs with uniform distribution */
- for (v = 0, i = 0; i < n; i++) {
+ for (v = 0, i = 0; i < n; i++) {
val[i] = v;
if (++v >= *domain)
v = 0;
}
+ mt_rng = mtwist_new();
+
/* mix BUNs randomly */
for (r = 0, i = 0; i < n; i++) {
- const BUN j = i + ((r += rand()) % (n - i));
+
+ const BUN j = i + ((r += mtwist_u32rand(mt_rng)) % (n - i));
const int tmp = val[i];
val[i] = val[j];
@@ -170,6 +172,8 @@ BATskewed(BAT **bn, oid *base, wrd *size
int *restrict val;
const BUN skewedSize = ((*skew) * n) / 100;
const int skewedDomain = ((100 - (*skew)) * (*domain)) / 100;
+ mtwist *mt_rng;
+
if (*size > (wrd)BUN_MAX) {
GDKerror("BATskewed: size must not exceed BUN_MAX = " BUNFMT,
BUN_MAX);
@@ -204,15 +208,17 @@ BATskewed(BAT **bn, oid *base, wrd *size
}
val = (int *) Tloc(b, BUNfirst(b));
+ mt_rng = mtwist_new();
+
/* create BUNs with skewed distribution */
for (i = 0; i < skewedSize; i++)
- val[i] = rand() % skewedDomain;
+ val[i] = mtwist_u32rand(mt_rng) % skewedDomain;
for( ; i < n; i++)
- val[i] = (rand() % (*domain - skewedDomain)) + skewedDomain;
+ val[i] = (mtwist_u32rand(mt_rng) % (*domain - skewedDomain)) +
skewedDomain;
/* mix BUNs randomly */
for (r = 0, i = 0; i < n; i++) {
- const BUN j = i + ((r += rand()) % (n - i));
+ const BUN j = i + ((r += mtwist_u32rand(mt_rng)) % (n - i));
const int tmp = val[i];
val[i] = val[j];
@@ -279,7 +285,7 @@ BATnormal(BAT **bn, oid *base, wrd *size
b = BATnew(TYPE_void, TYPE_int, n, TRANSIENT);
if (b == NULL) {
return GDK_FAIL;
- }
+ }
if (n == 0) {
b->tsorted = 1;
b->trevsorted = 0;
@@ -297,8 +303,8 @@ BATnormal(BAT **bn, oid *base, wrd *size
abs = (unsigned int *) GDKmalloc(d * sizeof(unsigned int));
if (abs == NULL) {
- BBPreclaim(b);
- return GDK_FAIL;
+ BBPreclaim(b);
+ return GDK_FAIL;
}
rel = (flt *) abs;
@@ -327,16 +333,16 @@ BATnormal(BAT **bn, oid *base, wrd *size
/* create BUNs with normal distribution */
for (j = 0, i = 0; i < n && j < d; i++) {
- while (j < d && abs[j] == 0)
- j++;
- if (j < d) {
- val[i] = j;
- abs[j]--;
- }
+ while (j < d && abs[j] == 0)
+ j++;
+ if (j < d) {
+ val[i] = j;
+ abs[j]--;
+ }
}
assert(i == n);
- while (j < d && abs[j] == 0)
- j++;
+ while (j < d && abs[j] == 0)
+ j++;
assert(j == d);
GDKfree(abs);
@@ -407,15 +413,19 @@ MBMmix(bat *bn, bat *batid)
BUN n, r, i;
BUN firstbun, p, q;
BAT *b;
+ mtwist *mt_rng;
if ((b = BATdescriptor(*batid)) == NULL)
- throw(MAL, "microbenchmark.mix", RUNTIME_OBJECT_MISSING);
+ throw(MAL, "microbenchmark.mix", RUNTIME_OBJECT_MISSING);
n = BATcount(b);
firstbun = BUNfirst(b);
+
+ mt_rng = mtwist_new();
+
/* mix BUNs randomly */
for (r = i = 0; i < n; i++) {
- BUN idx = i + ((r += (BUN) rand()) % (n - i));
+ BUN idx = i + ((r += (BUN) mtwist_u32rand(mt_rng)) % (n - i));
int val;
p = firstbun + i;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list