Update of /cvsroot/monetdb/MonetDB4/src/modules/plain
In directory
sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv13509/MonetDB4/src/modules/plain
Modified Files:
aggrX3.mx
Log Message:
In case the group OIDs span a range of more than SMALL_AGGR_MAX,
but the number of groups is less then SCAN_AGGR_MAX,
we use (backward-) "scan"-lookup (unrolled implementation exploiting
fall-through in C's switch statment) instead of hash-lookup,
as the latter turned out to be rather expensive ...
Index: aggrX3.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB4/src/modules/plain/aggrX3.mx,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- aggrX3.mx 11 Jan 2008 10:38:54 -0000 1.6
+++ aggrX3.mx 2 Mar 2008 17:29:50 -0000 1.7
@@ -29,7 +29,7 @@
\item
complete type-specific code expansion to avoid any type-checking in the
inner-most loops;
\item
-where feasible, replaced (expansive) hash-lookup by significantly cheaper
positional
+where feasible, replaced (expensive) hash-lookup by significantly cheaper
positional
void-lookups (if the head-column of the group-extend BAT ("e") is "void") or
at least by
(also positional) array lookups (in case the group-ids span a reasonably small
range);
\item
@@ -183,17 +183,17 @@
#include <gdk_scanselect.h> /* for type-specific
HT_bunfastins_nocheck_noinc(), until they're moved to gdk.mx */
#include "aggrX3.proto.h"
-/*
-with group OIDs spanning a range of less than SMALL_AGGR_MAX (the actual
[EMAIL PROTECTED]
+With group OIDs spanning a range of less than SMALL_AGGR_MAX (the actual
number of groups might be even less, in case there are "holes" in the group
OID range), we use a simple array as temporary sum/cnt table on order to
benefit from positional lookups; with size of sum <= 8 bytes and size of
-cnt == 4 bytes, we stay below 16 KBytes, i.e., within (almost) any L1 cache
-*/
+cnt == 4 bytes, we stay below 16 KBytes, i.e., within (almost) any L1 cache.
[EMAIL PROTECTED]
#define SMALL_AGGR_MAX 1024
@-
-The macro CHKrange is just for array-lookups, analogously to BUNfntVOID &
+The macro CHKrange is just for array-lookups, analogously to BUNfndVOID &
HASHfnd_oid for void- and hash-lookups, respectively
@c
/* if the test succeeds, we must return something not equal to
@@ -201,6 +201,34 @@
otherwise used */
#define CHKrange(r, bn, h) r = (BUN)(*(oid*)(h) >= min && *(oid*)(h) <=
max ? 0 : BUN_NONE)
[EMAIL PROTECTED]
+In case the group OIDs span a range of more than SMALL_AGGR_MAX,
+but the number of groups is less then SCAN_AGGR_MAX,
+we use (backward-) "scan"-lookup (unrolled implementation exploiting
+fall-through in C's switch statment) instead of hash-lookup,
+as the latter turned out to be rather expensive ...
[EMAIL PROTECTED]
+#define SCAN_AGGR_MAX 8
+
[EMAIL PROTECTED] SCAN_aggr_init
+ oid _h, _j = BATcount(bn);
+ oid *_bnh = (oid*) BUNhloc(bni, BUNfirst(bn));
+ BUN _r = BUNfirst(bn);
[EMAIL PROTECTED]
+#define SCANfndOID(r, bn, h) \
+ _h = *(oid*)(h), _j = BATcount(bn.b); \
+ r = BUN_NONE; \
+ switch (_j) { \
+ case 8: if (_bnh[7] == _h) { r = _r + 7; break; } \
+ case 7: if (_bnh[6] == _h) { r = _r + 6; break; } \
+ case 6: if (_bnh[5] == _h) { r = _r + 5; break; } \
+ case 5: if (_bnh[4] == _h) { r = _r + 4; break; } \
+ case 4: if (_bnh[3] == _h) { r = _r + 3; break; } \
+ case 3: if (_bnh[2] == _h) { r = _r + 2; break; } \
+ case 2: if (_bnh[1] == _h) { r = _r + 1; break; } \
+ case 1: if (_bnh[0] == _h) { r = _r + 0; break; } \
+ }
+
@- Result initialization
@c
/* init_result
@@ -258,13 +286,13 @@
@- Sum, Product & Average
@c
/* aggrX3_sum
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use sums-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use sums-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -322,13 +350,13 @@
@
@c
/* aggrX3_prod
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use prods-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use prods-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -385,13 +413,13 @@
@
@c
/* aggrX3_avg
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use sums-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use sums-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -506,19 +534,27 @@
@:aggrX3_sum(0,0,BUNfndVOID,var,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
+ } else if (range <= SMALL_AGGR_MAX) {
+ /* array lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_sum(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
+
@:aggrX3_sum(1,0,CHKrange,loc,&bhsb;bhsb++,@1,@2,&sums[(*(oid*)h)-min],@3)@
} else {
-
@:aggrX3_sum(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
+
@:aggrX3_sum(1,0,CHKrange,loc,BUNhloc(bi,p),@1,@2,&sums[(*(oid*)h)-min],@3)@
+ }
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+
@:aggrX3_sum(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,@2,[EMAIL PROTECTED](bni,r),@3)@
+ } else {
+
@:aggrX3_sum(0,0,SCANfndOID,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
}
} else {
- /* array lookup */
+ /* hash lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_sum(1,0,CHKrange,loc,&bhsb;bhsb++,@1,@2,&sums[(*(oid*)h)-min],@3)@
+
@:aggrX3_sum(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
} else {
-
@:aggrX3_sum(1,0,CHKrange,loc,BUNhloc(bi,p),@1,@2,&sums[(*(oid*)h)-min],@3)@
+
@:aggrX3_sum(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
}
}
@@ -562,19 +598,27 @@
@:aggrX3_prod(0,0,BUNfndVOID,var,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
+ } else if (range <= SMALL_AGGR_MAX) {
+ /* array lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_prod(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
+
@:aggrX3_prod(1,0,CHKrange,loc,&bhsb;bhsb++,@1,@2,&prods[(*(oid*)h)-min],@3)@
} else {
-
@:aggrX3_prod(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
+
@:aggrX3_prod(1,0,CHKrange,loc,BUNhloc(bi,p),@1,@2,&prods[(*(oid*)h)-min],@3)@
+ }
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+
@:aggrX3_prod(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
+ } else {
+
@:aggrX3_prod(0,0,SCANfndOID,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
}
} else {
- /* array lookup */
+ /* hash lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_prod(1,0,CHKrange,loc,&bhsb;bhsb++,@1,@2,&prods[(*(oid*)h)-min],@3)@
+
@:aggrX3_prod(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
} else {
-
@:aggrX3_prod(1,0,CHKrange,loc,BUNhloc(bi,p),@1,@2,&prods[(*(oid*)h)-min],@3)@
+
@:aggrX3_prod(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),@3)@
}
}
@@ -643,24 +687,16 @@
range = max - min + 1;
/* scan b, calculate sums & counts, derive averages */
+ slots = BATcount(e);
if (e->htype == TYPE_void) {
/* void lookup */
- slots = BATcount(e);
if (b->htype == TYPE_void) {
@:aggrX3_avg(0,0,BUNfndVOID,var,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
} else {
@:aggrX3_avg(0,0,BUNfndVOID,var,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
- slots = BATcount(e);
- if (b->htype == TYPE_void) {
-
@:aggrX3_avg(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
- } else {
-
@:aggrX3_avg(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
- }
- } else {
+ } else if (range <= SMALL_AGGR_MAX) {
/* array lookup */
slots = range;
if (b->htype == TYPE_void) {
@@ -668,6 +704,21 @@
} else {
@:aggrX3_avg(1,0,CHKrange,loc,BUNhloc(bi,p),@1,@2,&sums[(*(oid*)h)-min],(*(oid*)h)-min)@
}
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+
@:aggrX3_avg(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ } else {
+
@:aggrX3_avg(0,0,SCANfndOID,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ }
+ } else {
+ /* hash lookup */
+ if (b->htype == TYPE_void) {
+
@:aggrX3_avg(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ } else {
+
@:aggrX3_avg(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ }
}
*ret = bn;
@@ -685,13 +736,13 @@
@- "Extremes" (Min & Max)
@c
/* aggrX3_minmax_ptr
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: </> </> </> compare
operator: <(min) or >(max)
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: </> </> </> </>
compare operator: <(min) or >(max)
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -741,13 +792,13 @@
}
@c
/* aggrX3_minmax_oid
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: </> </> </> compare
operator: <(min) or >(max)
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: </> </> </> </>
compare operator: <(min) or >(max)
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -845,14 +896,7 @@
@:[EMAIL
PROTECTED](@2,0,BUNfndVOID,var,BUNhloc(bi,p),@3,@4,r-off,@6)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
- if (b->htype == TYPE_void) {
- @:[EMAIL PROTECTED](@2,1,HASHfnd_oid,loc,&bhsb;
bhsb++,@3,@4,r-off,@6)@
- } else {
- @:[EMAIL
PROTECTED](@2,1,HASHfnd_oid,loc,BUNhloc(bi,p),@3,@4,r-off,@6)@
- }
- } else {
+ } else if (range <= SMALL_AGGR_MAX) {
/* array lookup */
slots = range;
if (b->htype == TYPE_void) {
@@ -860,6 +904,21 @@
} else {
@:[EMAIL
PROTECTED](@2,0,CHKrange,loc,BUNhloc(bi,p),@3,@4,(*(oid*)h)-min,@6)@
}
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+ @:[EMAIL
PROTECTED](@2,0,SCANfndOID,loc,&bhsb;bhsb++,@3,@4,r-off,@6)@
+ } else {
+ @:[EMAIL
PROTECTED](@2,0,SCANfndOID,loc,BUNhloc(bi,p),@3,@4,r-off,@6)@
+ }
+ } else {
+ /* hash lookup */
+ if (b->htype == TYPE_void) {
+ @:[EMAIL PROTECTED](@2,1,HASHfnd_oid,loc,&bhsb;
bhsb++,@3,@4,r-off,@6)@
+ } else {
+ @:[EMAIL
PROTECTED](@2,1,HASHfnd_oid,loc,BUNhloc(bi,p),@3,@4,r-off,@6)@
+ }
}
*ret = bn;
bunins_failed:
@@ -917,13 +976,13 @@
@- Count
@c
/* aggrX3_count
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use cnt-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use cnt-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -1065,19 +1124,27 @@
@:aggrX3_count(0,0,BUNfndVOID,var,BUNhloc(bi,p),BUNtloc(bni,r))@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
+ } else if (range <= SMALL_AGGR_MAX) {
+ /* array lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_count(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,BUNtloc(bni,r))@
+
@:aggrX3_count(1,0,CHKrange,loc,&bhsb;bhsb++,&cnt[(*(oid*)h)-min])@
} else {
-
@:aggrX3_count(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),BUNtloc(bni,r))@
+
@:aggrX3_count(1,0,CHKrange,loc,BUNhloc(bi,p),&cnt[(*(oid*)h)-min])@
+ }
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+
@:aggrX3_count(0,0,SCANfndOID,loc,&bhsb;bhsb++,BUNtloc(bni,r))@
+ } else {
+
@:aggrX3_count(0,0,SCANfndOID,loc,BUNhloc(bi,p),BUNtloc(bni,r))@
}
} else {
- /* array lookup */
+ /* hash lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_count(1,0,CHKrange,loc,&bhsb;bhsb++,&cnt[(*(oid*)h)-min])@
+
@:aggrX3_count(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,BUNtloc(bni,r))@
} else {
-
@:aggrX3_count(1,0,CHKrange,loc,BUNhloc(bi,p),&cnt[(*(oid*)h)-min])@
+
@:aggrX3_count(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),BUNtloc(bni,r))@
}
}
@@ -1130,13 +1197,13 @@
@- Sum, Product & Average
@c
/* aggrX3_sum3
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use sums-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use sums-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -1206,13 +1273,13 @@
@
@c
/* aggrX3_prod3
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use prods-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use prods-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -1282,13 +1349,13 @@
@
@c
/* aggrX3_avg3
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use sums-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use sums-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -1448,27 +1515,39 @@
@:aggrX3_sum3(0,0,BUNfndVOID,var,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
+ } else if (range <= SMALL_AGGR_MAX) {
+ /* array lookup */
if (b->htype == TYPE_void) {
if ((g->htype ==
TYPE_void)&&(BATcount(b)==BATcount(g))&&(b->hseqbase==g->hseqbase)) {
-
@:aggrX3_sum3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),,@2)@
+ return [EMAIL PROTECTED]@2_EarrayBvoidGvoid
(bn, b, g, e, range, min, max);
} else {
-
@:aggrX3_sum3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
+
@:aggrX3_sum3(1,0,CHKrange,loc,&bhsb;bhsb++,@1,&sums[(*(oid*)h)-min],if (w >=
base && w < end),@2)@
}
} else {
-
@:aggrX3_sum3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
+
@:aggrX3_sum3(1,0,CHKrange,loc,BUNhloc(bi,p),@1,&sums[(*(oid*)h)-min],if (w >=
base && w < end),@2)@
+ }
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+ if ((g->htype ==
TYPE_void)&&(BATcount(b)==BATcount(g))&&(b->hseqbase==g->hseqbase)) {
+
@:aggrX3_sum3(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),,@2)@
+ } else {
+
@:aggrX3_sum3(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
+ }
+ } else {
+
@:aggrX3_sum3(0,0,SCANfndOID,loc,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
} else {
- /* array lookup */
+ /* hash lookup */
if (b->htype == TYPE_void) {
if ((g->htype ==
TYPE_void)&&(BATcount(b)==BATcount(g))&&(b->hseqbase==g->hseqbase)) {
- return [EMAIL PROTECTED]@2_EarrayBvoidGvoid
(bn, b, g, e, range, min, max);
+
@:aggrX3_sum3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),,@2)@
} else {
-
@:aggrX3_sum3(1,0,CHKrange,loc,&bhsb;bhsb++,@1,&sums[(*(oid*)h)-min],if (w >=
base && w < end),@2)@
+
@:aggrX3_sum3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
} else {
-
@:aggrX3_sum3(1,0,CHKrange,loc,BUNhloc(bi,p),@1,&sums[(*(oid*)h)-min],if (w >=
base && w < end),@2)@
+
@:aggrX3_sum3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
}
@@ -1548,27 +1627,39 @@
@:aggrX3_prod3(0,0,BUNfndVOID,var,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
+ } else if (range <= SMALL_AGGR_MAX) {
+ /* array lookup */
if (b->htype == TYPE_void) {
if ((g->htype ==
TYPE_void)&&(BATcount(b)==BATcount(g))&&(b->hseqbase==g->hseqbase)) {
-
@:aggrX3_prod3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),,@2)@
+ return [EMAIL PROTECTED]@2_EarrayBvoidGvoid
(bn, b, g, e, range, min, max);
} else {
-
@:aggrX3_prod3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
+
@:aggrX3_prod3(1,0,CHKrange,loc,&bhsb;bhsb++,@1,&prods[(*(oid*)h)-min],if (w >=
base && w < end),@2)@
}
} else {
-
@:aggrX3_prod3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >=
base && w < end),@2)@
+
@:aggrX3_prod3(1,0,CHKrange,loc,BUNhloc(bi,p),@1,&prods[(*(oid*)h)-min],if (w
>= base && w < end),@2)@
+ }
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+ if ((g->htype ==
TYPE_void)&&(BATcount(b)==BATcount(g))&&(b->hseqbase==g->hseqbase)) {
+
@:aggrX3_prod3(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),,@2)@
+ } else {
+
@:aggrX3_prod3(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
+ }
+ } else {
+
@:aggrX3_prod3(0,0,SCANfndOID,loc,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
} else {
- /* array lookup */
+ /* hash lookup */
if (b->htype == TYPE_void) {
if ((g->htype ==
TYPE_void)&&(BATcount(b)==BATcount(g))&&(b->hseqbase==g->hseqbase)) {
- return [EMAIL PROTECTED]@2_EarrayBvoidGvoid
(bn, b, g, e, range, min, max);
+
@:aggrX3_prod3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),,@2)@
} else {
-
@:aggrX3_prod3(1,0,CHKrange,loc,&bhsb;bhsb++,@1,&prods[(*(oid*)h)-min],if (w >=
base && w < end),@2)@
+
@:aggrX3_prod3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,BUNtloc(bni,r),if (w >= base
&& w < end),@2)@
}
} else {
-
@:aggrX3_prod3(1,0,CHKrange,loc,BUNhloc(bi,p),@1,&prods[(*(oid*)h)-min],if (w
>= base && w < end),@2)@
+
@:aggrX3_prod3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,BUNtloc(bni,r),if (w >=
base && w < end),@2)@
}
}
@@ -1651,24 +1742,16 @@
range = max - min + 1;
/* scan b & g, calculate sums & counts, derive averages */
+ slots = BATcount(e);
if (e->htype == TYPE_void) {
/* void lookup */
- slots = BATcount(e);
if (b->htype == TYPE_void) {
@:aggrX3_avg3(0,0,BUNfndVOID,var,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
} else {
@:aggrX3_avg3(0,0,BUNfndVOID,var,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
- slots = BATcount(e);
- if (b->htype == TYPE_void) {
-
@:aggrX3_avg3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
- } else {
-
@:aggrX3_avg3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
- }
- } else {
+ } else if (range <= SMALL_AGGR_MAX) {
/* array lookup */
slots = range;
if (b->htype == TYPE_void) {
@@ -1676,6 +1759,21 @@
} else {
@:aggrX3_avg3(1,0,CHKrange,loc,BUNhloc(bi,p),@1,@2,&sums[(*(oid*)h)-min],(*(oid*)h)-min)@
}
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+
@:aggrX3_avg3(0,0,SCANfndOID,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ } else {
+
@:aggrX3_avg3(0,0,SCANfndOID,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ }
+ } else {
+ /* hash lookup */
+ if (b->htype == TYPE_void) {
+
@:aggrX3_avg3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ } else {
+
@:aggrX3_avg3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),@1,@2,[EMAIL
PROTECTED](bni,r),r-off)@
+ }
}
*ret = bn;
@@ -1693,13 +1791,13 @@
@- "Extremes" (Min & Max)
@c
/* aggrX3_minmax3_ptr
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: </> </> </> compare
operator: <(min) or >(max)
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: </> </> </> </>
compare operator: <(min) or >(max)
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -1755,13 +1853,13 @@
}
@c
/* aggrX3_minmax3_oid
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: </> </> </> compare
operator: <(min) or >(max)
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: </> </> </> </>
compare operator: <(min) or >(max)
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -1874,14 +1972,7 @@
@:[EMAIL
PROTECTED](@2,0,BUNfndVOID,var,BUNhloc(bi,p),@3,@4,r-off,@6)@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
- if (b->htype == TYPE_void) {
- @:[EMAIL PROTECTED](@2,1,HASHfnd_oid,loc,&bhsb;
bhsb++,@3,@4,r-off,@6)@
- } else {
- @:[EMAIL
PROTECTED](@2,1,HASHfnd_oid,loc,BUNhloc(bi,p),@3,@4,r-off,@6)@
- }
- } else {
+ } else if (range <= SMALL_AGGR_MAX) {
/* array lookup */
slots = range;
if (b->htype == TYPE_void) {
@@ -1889,6 +1980,21 @@
} else {
@:[EMAIL
PROTECTED](@2,0,CHKrange,loc,BUNhloc(bi,p),@3,@4,(*(oid*)h)-min,@6)@
}
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+ @:[EMAIL
PROTECTED](@2,0,SCANfndOID,loc,&bhsb;bhsb++,@3,@4,r-off,@6)@
+ } else {
+ @:[EMAIL
PROTECTED](@2,0,SCANfndOID,loc,BUNhloc(bi,p),@3,@4,r-off,@6)@
+ }
+ } else {
+ /* hash lookup */
+ if (b->htype == TYPE_void) {
+ @:[EMAIL PROTECTED](@2,1,HASHfnd_oid,loc,&bhsb;
bhsb++,@3,@4,r-off,@6)@
+ } else {
+ @:[EMAIL
PROTECTED](@2,1,HASHfnd_oid,loc,BUNhloc(bi,p),@3,@4,r-off,@6)@
+ }
}
*ret = bn;
bunins_failed:
@@ -1951,13 +2057,13 @@
@- Count
@c
/* aggrX3_count3
- e-void-head e-oid-head e-oid-head
- void-lookup hash-lookup array-lookup
+ e-void-head e-oid-head e-oid-head e-oid-head
+ void-lookup array-lookup scan-lookup hash-lookup
- @1: 0 0 1 use cnt-array?
- @2: 0 1 0 do
BATprepareHash?
- @3: BUNfndVOID HASHfnd_oid CHKrange lookup
- @4: var loc loc e/bn-head-access
+ @1: 0 1 0 0
use cnt-array?
+ @2: 0 0 0 1
do BATprepareHash?
+ @3: BUNfndVOID CHKrange SCANfndOID HASHfnd_oid
lookup
+ @4: var loc loc loc
e/bn-head-access
@5: "BUNhloc(b,p)" for (oid) b-head-type, b-head access
"&bhsb; bhsb++" for (void) b-head-type
@@ -2117,19 +2223,27 @@
@:aggrX3_count3(0,0,BUNfndVOID,var,BUNhloc(bi,p),BUNtloc(bni,r))@
}
/* e->htype == TYPE_oid */
- } else if (range > SMALL_AGGR_MAX) {
- /* hash lookup */
+ } else if (range <= SMALL_AGGR_MAX) {
+ /* array lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_count3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,BUNtloc(bni,r))@
+
@:aggrX3_count3(1,0,CHKrange,loc,&bhsb;bhsb++,&cnt[(*(oid*)h)-min])@
} else {
-
@:aggrX3_count3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),BUNtloc(bni,r))@
+
@:aggrX3_count3(1,0,CHKrange,loc,BUNhloc(bi,p),&cnt[(*(oid*)h)-min])@
+ }
+ } else if (BATcount(e) <= SCAN_AGGR_MAX) {
+ /* scan lookup */
+ @:SCAN_aggr_init@
+ if (b->htype == TYPE_void) {
+
@:aggrX3_count3(0,0,SCANfndOID,loc,&bhsb;bhsb++,BUNtloc(bni,r))@
+ } else {
+
@:aggrX3_count3(0,0,SCANfndOID,loc,BUNhloc(bi,p),BUNtloc(bni,r))@
}
} else {
- /* array lookup */
+ /* hash lookup */
if (b->htype == TYPE_void) {
-
@:aggrX3_count3(1,0,CHKrange,loc,&bhsb;bhsb++,&cnt[(*(oid*)h)-min])@
+
@:aggrX3_count3(0,1,HASHfnd_oid,loc,&bhsb;bhsb++,BUNtloc(bni,r))@
} else {
-
@:aggrX3_count3(1,0,CHKrange,loc,BUNhloc(bi,p),&cnt[(*(oid*)h)-min])@
+
@:aggrX3_count3(0,1,HASHfnd_oid,loc,BUNhloc(bi,p),BUNtloc(bni,r))@
}
}
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins