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

Reply via email to