Changeset: b81fe596630b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b81fe596630b Modified Files: monetdb5/extras/bwd/operations.c Branch: bwd Log Message:
* adapting the bounds for <= and >= selections
* refactored out the selection refinement loop
Unterschiede (220 Zeilen):
diff --git a/monetdb5/extras/bwd/operations.c b/monetdb5/extras/bwd/operations.c
--- a/monetdb5/extras/bwd/operations.c
+++ b/monetdb5/extras/bwd/operations.c
@@ -374,8 +374,8 @@ static inline str uselect(bat *res, bat
{
const int parameters[2] = {
-
((*(int*)val)>>batTailResidualBits(data))<<batTailResidualBits(data),
-
val2?(((*(int*)val2)>>batTailResidualBits(data))<<batTailResidualBits(data)):0};
+
((((*(int*)val)>>batTailResidualBits(data))<<batTailResidualBits(data)) -
(OP[1]=='='?(1<<batTailResidualBits(data)):0)),
+
val2?((((*(int*)val2)>>batTailResidualBits(data))<<batTailResidualBits(data)) +
(OP2[1]=='='?(1<<batTailResidualBits(data)):0)):0};
int i;
for (i = 0; i < 2; ++i)
if((err =
clSetKernelArg(selectKernel, bufferI+i, sizeof(int), &(parameters[i])))) //
type specific
@@ -413,8 +413,90 @@ str BWDThetauselectApproximate(bat *res,
return uselect(res, bid, val, *OP, 0, NULL, context);
}
+static inline unsigned int refinementLoop(str OP, str OP2, const int value1,
const int value2, size_t candidateCount,
+
clHead* compressedHead,
clTail* compressedTail, const unsigned char* residuals,
+
const int
tailApproximationBytes, const int tailResidualBits,
+
oid* positionRegion){
+/* use cpp | egrep -v "^#" | indent to expand */
+
+ const int tailApproximationMask = (1<<(tailApproximationBytes*8))-1;
+ const unsigned int residualMask = (1 << tailResidualBits)-1;
+ const unsigned int residualBytes = tailResidualBits/8;
+ unsigned int i, j;
+#define refineLoopDoubleOperator(comparator, comparator2)
\
+ while(i < candidateCount) {
\
+ const int index = compressedHead->positions[i];
\
+ const int offset = tailApproximationBytes*i++;
\
+ const int compressedValue =
*(int*)&(compressedTail->elements[offset]) & tailApproximationMask; \
+ const int deCompressedValue = compressedTail->base+
\
+ (compressedValue << tailResidualBits)
\
+ + (*(int*)&residuals[i*residualBytes] & residualMask);
\
+ {
\
+ positionRegion[j] = index;
\
+ j+= ((deCompressedValue comparator value1) &
\
+ (deCompressedValue comparator2
value2));
\
+ }
\
+ }
+#define refineLoopSingleOperator(comparator)
\
+ while(i < candidateCount) {
\
+ const unsigned int index = compressedHead->positions[i];
\
+ const unsigned int offset = (tailApproximationBytes)*i++;
\
+ const int compressedValue =
*(int*)&(compressedTail->elements[offset]) & tailApproximationMask; \
+ const int deCompressedValue = compressedTail->base+
\
+ (compressedValue << tailResidualBits)
\
+ + (*(int*)&residuals[index*residualBytes] &
residualMask); \
+ if(deCompressedValue comparator value1) {
\
+ positionRegion[j++] = index;
\
+ }
\
+ }
+#define refineLoop(comparator, comparator2) \
+ if(comparator2 == NULL) {
\
+ refineLoopSingleOperator(comparator);
\
+ } else {
\
+ switch (comparator2[0]){
\
+ case '<':
\
+ switch((comparator2)[1]){
\
+ case '\0':
\
+ refineLoopDoubleOperator(comparator, <);
\
+ case '=':
\
+ refineLoopDoubleOperator(comparator, <=);
\
+ }
\
+ case '>':
\
+ switch((comparator2)[1]){
\
+ case '\0':
\
+ refineLoopDoubleOperator(comparator, >);
\
+ case '=':
\
+ refineLoopDoubleOperator(comparator, <=);
\
+ }
\
+ case '=':
\
+ refineLoopDoubleOperator(comparator, ==);
\
+ }
\
+ }
+ switch (OP[0]){
+ case '<':
+ switch(OP[1]){
+ case '\0':
+ refineLoop(<, OP2);
+ case '=':
+ refineLoop(<=, OP2);
+ }
+ case '>':
+ switch(OP[1]){
+ case '\0':
+ refineLoop(>, OP2);
+ case '=':
+ refineLoop(>=, OP2);
+ }
+ case '=':
+ refineLoop(==, OP2);
+ }
+#undef refineLoop
+#undef refineLoopSingleOperator
+#undef refineLoopDoubleOperator
+ return j;
+}
+
str uselectrefine(bat *res, bat *bid, ptr val, str OP, ptr val2, str OP2, bat
*approx, Client context) {
-
BAT* data = BATdescriptor(*bid);
BAT* result;
if(data == NULL)
@@ -457,9 +539,8 @@ str uselectrefine(bat *res, bat *bid, pt
/* const unsigned int approximationMask
= ~((1 << (32 - batTailApproximationBits(approximation)))-1); */
const unsigned char* residuals =
batTailResiduals(data);
- const unsigned int residualMask = (1 <<
batTailResidualBits(data))-1;
- const unsigned int residualBytes =
batTailResidualBits(data)/8;
- unsigned int i = 0, j = 0;
+ /* const unsigned int residualMask = (1
<< batTailResidualBits(data))-1; */
+ /* const unsigned int residualBytes =
batTailResidualBits(data)/8; */
clTail* compressedTail;
@@ -474,93 +555,16 @@ str uselectrefine(bat *res, bat *bid, pt
if(err) printf("#%s,
clEnqueueReadBuffer: %s;\n", __func__, clError(err));
}
+ {
+ unsigned int j =
refinementLoop(OP, OP2, *(int*)val, val2?*(int*)val2:0, candidateCount,
+
compressedHead, compressedTail, residuals,
+
batTailApproximationBits(approximation)/8 -
batTailOffsetBits(approximation)/8,
+
batTailResidualBits(approximation),
+
positionRegion);
- /* int* resultRegion = (int*)
Tloc(result, BUNfirst(result)); // type specific */
-
- /* struct timespec before, after; */
- /*
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &before); */
- if(1){
- const int
tailApproximationBytes = batTailApproximationBits(approximation)/8 -
batTailOffsetBits(approximation)/8;
- const int tailApproximationMask
= (1<<(tailApproximationBytes*8))-1;
- const int tailResidualBits =
batTailResidualBits(approximation);
- const int value1 = *(int*)val;
- const int value2 =
val2?*(int*)val2:0;
-#define refineLoopDoubleOperator(comparator, comparator2)
\
- while(i < candidateCount) {
\
- const int index =
compressedHead->positions[i]; \
- const int offset =
tailApproximationBytes*i++; \
- const int
compressedValue = *(int*)&(compressedTail->elements[offset]) &
tailApproximationMask; \
- const int
deCompressedValue = compressedTail->base+ \
-
(compressedValue << tailResidualBits)
\
- +
(*(int*)&residuals[i*residualBytes] & residualMask); \
- {
\
-
positionRegion[j] = index;
\
- j+=
((deCompressedValue comparator value1) &
\
-
(deCompressedValue comparator2 value2));
\
- }
\
- }
-#define refineLoopSingleOperator(comparator)
\
- while(i < candidateCount) {
\
- const unsigned int index =
compressedHead->positions[i]; \
- const unsigned int offset =
(tailApproximationBytes)*i++; \
- const int compressedValue =
*(int*)&(compressedTail->elements[offset]) & tailApproximationMask; \
- const int deCompressedValue =
compressedTail->base+ \
- (compressedValue <<
tailResidualBits)
\
- +
(*(int*)&residuals[index*residualBytes] & residualMask); \
- if(deCompressedValue comparator
value1) {
\
- positionRegion[j++] = index;
\
- }
\
+ printf ("%s reduced the result
from %zd to %d\n", __func__, candidateCount, j);
+ BATsetcount(result, j);
}
-#define refineLoop(comparator, comparator2)
\
- if(comparator2 == NULL) {
\
-
refineLoopSingleOperator(comparator); \
- } else {
\
- switch
(comparator2[0]){
\
- case '<':
\
-
switch((comparator2)[1]){
\
- case '\0':
\
-
refineLoopDoubleOperator(comparator, <); \
- case '=':
\
-
refineLoopDoubleOperator(comparator, <=); \
- }
\
- case '>':
\
-
switch((comparator2)[1]){
\
- case '\0':
\
-
refineLoopDoubleOperator(comparator, >); \
- case '=':
\
-
refineLoopDoubleOperator(comparator, <=); \
- }
\
- case '=':
\
-
refineLoopDoubleOperator(comparator, ==); \
- }
\
- }
- switch (OP[0]){
- case '<':
- switch(OP[1]){
- case '\0':
- refineLoop(<,
OP2);
- case '=':
- refineLoop(<=,
OP2);
- }
- case '>':
- switch(OP[1]){
- case '\0':
- refineLoop(>,
OP2);
- case '=':
- refineLoop(>=,
OP2);
- }
- case '=':
- refineLoop(==, OP2);
- }
-#undef refineLoop
-#undef refineLoopSingleOperator
-#undef refineLoopDoubleOperator
- }
- /*
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &after); */
- /* printf ("refinement took %ld
nanoseconds\n",(after.tv_sec*1000000000+after.tv_nsec)-(before.tv_sec*1000000000+before.tv_nsec));
*/
-
- printf ("%s reduced the result from %zd
to %d\n", __func__, candidateCount, j);
- BATsetcount(result, j);
BATseqbase(BATmirror(result), oid_nil);
free(compressedHead);
free(compressedTail);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
