Changeset: 8c22cfc1904e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c22cfc1904e
Modified Files:
gdk/gdk_select.c
Branch: default
Log Message:
Code expansion to speedup select
The first step towards better performance using code-expansion
of function calls.
diffs (233 lines):
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -145,6 +145,7 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn,
}
/* scan select loop with candidates */
+
#define candscanloop(TEST) \
do { \
ALGODEBUG fprintf(stderr, \
@@ -178,6 +179,92 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn,
} \
} while (0)
+#define SCANLOOPCAND(TYPE)\
+ do { TYPE *src = (TYPE*) Tloc(b, b->U->first);\
+ oid *dst = (oid*) Tloc(bn, bn->U->first);\
+ BUN r;\
+ if (equi){\
+ assert(li && hi);\
+ assert(!anti);\
+ for ((i) = (p); (i) < (q); (i)++){ \
+ r = (BUN) (*candlist++ - off) ;\
+ if ( (src)[(BUN) (*candlist++ - off) ] ==
*(TYPE*) tl ) \
+ (dst)[cnt++] = i;\
+ }\
+ } else if (anti){\
+ if ( nil == NULL) \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ r = (BUN) (*candlist++ - off) ;\
+ if ( ((lval && ( *(TYPE*) tl > (src)[r] || (!li
&& ((src)[r] == *(TYPE*) tl)) )) ||\
+ (hval && ( *(TYPE*) th < (src)[r] || (!hi
&& ((src)[r] == *(TYPE*) th)) ))) )\
+ (dst)[cnt++] = i;\
+ } else \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ r = (BUN) (*candlist++ - off) ;\
+ if ( ((src)[i] != TYPE##_nil) &&\
+ ((lval && ( *(TYPE*) tl > (src)[r] || (!li &&
((src)[r] == *(TYPE*) tl)) )) ||\
+ (hval && ( *(TYPE*) th < (src)[r] || (!hi &&
((src)[r] == *(TYPE*) th)) ))) )\
+ (dst)[cnt++] = i;\
+ }\
+ } else {\
+ if ( nil == NULL) \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ r = (BUN) (*candlist++ - off) ;\
+ if( (!lval || ( *(TYPE*) tl < (src)[r] || (li
&& ((src)[r] == *(TYPE*) tl)))) &&\
+ (!hval || ( *(TYPE*) th > (src)[r] || (hi &&
((src)[r] == *(TYPE*) th)))))\
+ (dst)[cnt++] = i;\
+ } else \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ r = (BUN) (*candlist++ - off) ;\
+ if( ((src)[i] != TYPE##_nil) &&\
+ (!lval || ( *(TYPE*) tl < (src)[r] || (li &&
((src)[r] == *(TYPE*) tl)))) &&\
+ (!hval || ( *(TYPE*) th > (src)[r] || (hi &&
((src)[r] == *(TYPE*) th)))))\
+ (dst)[cnt++] = i;\
+ }\
+ }\
+ BATsetcount(bn,cnt);\
+ } while (0)
+
+#define SCANLOOP(TYPE)\
+ do { TYPE *src = (TYPE*) Tloc(b, b->U->first);\
+ oid *dst = (oid*) Tloc(bn, bn->U->first);\
+ if (equi){\
+ assert(li && hi);\
+ assert(!anti);\
+ for ((i) = (p); (i) < (q); (i)++) \
+ if ( (src)[i] == *(TYPE*) tl ) \
+ (dst)[cnt++] = i;\
+ } else if (anti){\
+ if ( nil == NULL) \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ if ( ((lval && ( *(TYPE*) tl > (src)[i] || (!li
&& ((src)[i] == *(TYPE*) tl)) )) ||\
+ (hval && ( *(TYPE*) th < (src)[i] || (!hi &&
((src)[i] == *(TYPE*) th)) ))) )\
+ (dst)[cnt++] = i;\
+ } else \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ if ( ((src)[i] != TYPE##_nil) &&\
+ ((lval && ( *(TYPE*) tl > (src)[i] || (!li &&
((src)[i] == *(TYPE*) tl)) )) ||\
+ (hval && ( *(TYPE*) th < (src)[i] || (!hi &&
((src)[i] == *(TYPE*) th)) ))) )\
+ (dst)[cnt++] = i;\
+ }\
+ } else {\
+ if ( nil == NULL) \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ if( (!lval || ( *(TYPE*) tl < (src)[i] || (li
&& ((src)[i] == *(TYPE*) tl)))) &&\
+ (!hval || ( *(TYPE*) th > (src)[i] || (hi &&
((src)[i] == *(TYPE*) th)))))\
+ (dst)[cnt++] = i;\
+ } else \
+ for ((i) = (p); (i) < (q); (i)++) {\
+ if( ((src)[i] != TYPE##_nil) &&\
+ (!lval || ( *(TYPE*) tl < (src)[i] || (li &&
((src)[i] == *(TYPE*) tl)))) &&\
+ (!hval || ( *(TYPE*) th > (src)[i] || (hi &&
((src)[i] == *(TYPE*) th)))))\
+ (dst)[cnt++] = i;\
+ }\
+ }\
+ BATsetcount(bn,cnt);\
+ } while (0)
+
+
static BAT *
BAT_scanselect(BAT *b, BAT *s, BAT *bn, const void *tl, const void *th,
int li, int hi, int equi, int anti, int lval, int hval)
@@ -185,6 +272,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
BATiter bi = bat_iterator(b);
int (*cmp)(const void *, const void *);
BUN p, q;
+ BUN i,cnt =0;
oid o, off;
const void *nil, *v;
int c;
@@ -193,6 +281,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
assert(bn != NULL);
assert(bn->htype == TYPE_void);
assert(bn->ttype == TYPE_oid);
+ assert(BATcount(b) <= BATcapacity(bn));
assert(anti == 0 || anti == 1);
assert(!lval || tl != NULL);
assert(!hval || th != NULL);
@@ -218,26 +307,35 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
/* should we return an error if p > BUNfirst(s) || q <
* BUNlast(s) (i.e. s not fully used)? */
candlist = (const oid *) Tloc(s, p);
- if (equi) {
- assert(li && hi);
- assert(!anti);
- candscanloop((*cmp)(tl, v) == 0);
- } else if (anti) {
- candscanloop((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((lval &&
- ((c = (*cmp)(tl, v)) > 0 ||
- (!li && c == 0))) ||
- (hval &&
- ((c = (*cmp)(th, v)) < 0 ||
- (!hi && c == 0)))));
- } else {
- candscanloop((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((!lval ||
- (c = cmp(tl, v)) < 0 ||
- (li && c == 0)) &&
- (!hval ||
- (c = cmp(th, v)) > 0 ||
- (hi && c == 0))));
+ switch(ATOMstorage(b->ttype) ){
+ case TYPE_bte: SCANLOOPCAND(bte); break;
+ case TYPE_sht: SCANLOOPCAND(sht); break;
+ case TYPE_int: SCANLOOPCAND(int); break;
+ case TYPE_flt: SCANLOOPCAND(flt); break;
+ case TYPE_dbl: SCANLOOPCAND(dbl); break;
+ case TYPE_lng: SCANLOOPCAND(lng); break;
+ default:
+ if (equi) {
+ assert(li && hi);
+ assert(!anti);
+ candscanloop((*cmp)(tl, v) == 0);
+ } else if (anti) {
+ candscanloop((nil == NULL || (*cmp)(v, nil) !=
0) &&
+ ((lval &&
+ ((c = (*cmp)(tl, v)) > 0 ||
+ (!li && c == 0))) ||
+ (hval &&
+ ((c = (*cmp)(th, v)) < 0 ||
+ (!hi && c == 0)))));
+ } else {
+ candscanloop((nil == NULL || (*cmp)(v, nil) !=
0) &&
+ ((!lval ||
+ (c = cmp(tl, v)) < 0 ||
+ (li && c == 0)) &&
+ (!hval ||
+ (c = cmp(th, v)) > 0 ||
+ (hi && c == 0))));
+ }
}
} else {
if (s) {
@@ -254,26 +352,27 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
p = BUNfirst(b);
q = BUNlast(b);
}
- if (equi) {
- assert(li && hi);
- assert(!anti);
- scanloop((*cmp)(tl, v) == 0);
- } else if (anti) {
- scanloop((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((lval &&
- ((c = (*cmp)(tl, v)) > 0 ||
- (!li && c == 0))) ||
- (hval &&
- ((c = (*cmp)(th, v)) < 0 ||
- (!hi && c == 0)))));
- } else {
- scanloop((nil == NULL || (*cmp)(v, nil) != 0) &&
- ((!lval ||
- (c = cmp(tl, v)) < 0 ||
- (li && c == 0)) &&
- (!hval ||
- (c = cmp(th, v)) > 0 ||
- (hi && c == 0))));
+ switch(ATOMstorage(b->ttype) ){
+ case TYPE_bte: SCANLOOP(bte); break;
+ case TYPE_sht: SCANLOOP(sht); break;
+ case TYPE_int: SCANLOOP(int); break;
+ case TYPE_flt: SCANLOOP(flt); break;
+ case TYPE_dbl: SCANLOOP(dbl); break;
+ case TYPE_lng: SCANLOOP(lng); break;
+ default:
+ if (equi) {
+ assert(li && hi);
+ assert(!anti);
+ scanloop((*cmp)(tl, v) == 0);
+ } else if (anti) {
+ scanloop((nil == NULL || (*cmp)(v, nil) != 0) &&
+ ((lval && ((c = (*cmp)(tl, v)) > 0 ||
(!li && c == 0))) ||
+ (hval && ((c = (*cmp)(th, v)) < 0 ||
(!hi && c == 0)))));
+ } else {
+ scanloop((nil == NULL || (*cmp)(v, nil) != 0) &&
+ ((!lval || (c = cmp(tl, v)) < 0 || (li
&& c == 0)) &&
+ (!hval || (c = cmp(th, v)) > 0 || (hi
&& c == 0))));
+ }
}
}
bn->tsorted = 1;
@@ -616,7 +715,7 @@ BATsubselect(BAT *b, BAT *s, const void
}
}
- bn = BATnew(TYPE_void, TYPE_oid, estimate);
+ bn = BATnew(TYPE_void, TYPE_oid, BATcount(b));
if (bn == NULL)
return NULL;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list