Changeset: 86183e7d8e3b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=86183e7d8e3b
Modified Files:
        monetdb5/extras/bwd/operations.c
Branch: bwd
Log Message:

* optimizing the projection for the full gpu-resident case as well


Unterschiede (108 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
@@ -3,6 +3,8 @@
 #include "monetdb_config.h"
 #include "opt_statistics.h"
 #include "algebra.h"
+#include <math.h>
+
 
 #include "bwd.h"
 
@@ -149,7 +151,7 @@ str BWDLeftJoinApproximate(bat * res, ba
        return MAL_SUCCEED;
 };
 
-static inline int decompressIntValue(int i, int approximationbits, clTail* 
compressedTail, const unsigned char* residuals, int residualI){
+static inline int decompressIntValue(const int i, const int approximationbits, 
const clTail* compressedTail, const unsigned char* residuals, const int 
residualI){
        /* const int index = compressedHead->positions[i];                      
                 */
        const int residualBits = 32-approximationbits;
        const unsigned int residualMask = (1 << residualBits)-1;
@@ -604,51 +606,56 @@ str BWDSemijoinRefine(int *res, int *lid
        BAT* refinement;
        if(BAThvoid(left)  && ATOMstorage(BATttype(left)) == TYPE_int && 
BAThtype(right) == TYPE_oid){ // TODO: type specific
                refinement = BATnew(TYPE_void, BATttype(left), right->batCount);
+
                BATseqbase(refinement, oid_nil);
+               
                size_t bufferSize;
                getPositionsColumn(batTailPositions(approximation), NULL, 
&bufferSize);
                clHead* supersetPositionsColumn = 
getPositionsColumn(batTailPositions(approximation), malloc(bufferSize), 
&bufferSize);
-               getApproximateValuesColumn(batTailApproximation(approximation), 
NULL, &bufferSize);
-               clTail* supersetApproximateValuesColumn = 
getApproximateValuesColumn(batTailApproximation(approximation), 
malloc(bufferSize), &bufferSize);
+               unsigned char* filteredResiduals = NULL;
 
-               unsigned char* filteredResiduals;
-               size_t refinementCount = 0;
-               if(supersetPositionsColumn){ // if the approximation is empty, 
the memory objects are NULL
-                       int* refinementRegion = (int*) Tloc(refinement, 
BUNfirst(refinement));
-                       const unsigned char* residuals = batTailResiduals(left);
-                       const unsigned int residualBytes = 
Tsize(left)-approximationBits/8;
+               if(supersetPositionsColumn->count == BATcount(right)){ // the 
approximation was correct, no refinement necessary
+                       clEnqueueReadBuffer(getCommandQueue(), 
batTailApproximation(approximation), CL_TRUE, sizeof(clTail), 
BATcount(right)*sizeof(int), Tloc(refinement, BUNfirst(refinement)), 0, NULL, 
NULL);
+                       BATsetcount(refinement, supersetPositionsColumn->count);
+               } else {
 
-                       filteredResiduals = 
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
-                       const size_t leftHMin = left->hseqbase, leftHMax = 
left->hseqbase + BATcount(left);
+                       
getApproximateValuesColumn(batTailApproximation(approximation), NULL, 
&bufferSize);
+                       clTail* supersetApproximateValuesColumn = 
getApproximateValuesColumn(batTailApproximation(approximation), 
malloc(bufferSize), &bufferSize);
+
+                       size_t refinementCount = 0;
+                       if(supersetPositionsColumn){
+                               { // if the approximation is empty, the memory 
objects are NULL
+                                       int* refinementRegion = (int*) 
Tloc(refinement, BUNfirst(refinement));
+                                       const unsigned char* residuals = 
batTailResiduals(left);
+                                       const unsigned int residualBytes = 
Tsize(left)-approximationBits/8;
+
+                                       filteredResiduals = 
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
+                                       const size_t leftHMin = left->hseqbase, 
leftHMax = left->hseqbase + BATcount(left);
                        
-                       int i,j;
-                       /* for ( i = 0; i < supersetPositionsColumn->count; 
++i) { */
-                       /*      if((supersetPositionsColumn->positions[i] >= 
leftHMin) & (supersetPositionsColumn->positions[i] < leftHMax)){ */
-                       /*              refinementRegion[refinementCount++] = 
decompressIntValue(i, approximationBits, supersetApproximateValuesColumn, 
residuals, supersetPositionsColumn->positions[i]); */
-                       /*      } */
-                       /* } */
-                       for ( i = j = 0; j < BATcount(right); ++j) {
-                               while(supersetPositionsColumn->positions[i] != 
((oid*)right->H->heap.base)[j])
-                                       i++;
-                               /* if((supersetPositionsColumn->positions[i] >= 
leftHMin) & (supersetPositionsColumn->positions[i] < leftHMax)) */{
-                                       refinementRegion[refinementCount++] = 
decompressIntValue(i, approximationBits, supersetApproximateValuesColumn, 
residuals, supersetPositionsColumn->positions[i]);
+                                       int i,j;
+                                       for ( i = j = 0; j < BATcount(right); 
++j) {
+                                               
while(supersetPositionsColumn->positions[i] != ((oid*)right->H->heap.base)[j])
+                                                       i++;
+                                               
refinementRegion[refinementCount++] = decompressIntValue(i, approximationBits, 
supersetApproximateValuesColumn, residuals, 
supersetPositionsColumn->positions[i]);
+                                       }
                                }
+                       }else {
+                               printf ("uh oh, %s ran into an unimplemented 
case: no approximation provided\n", __func__);
                        }
-               } else {
-                       printf ("uh oh, %s ran into an unimplemented case\n", 
__func__);
-               }
 
-               BATsetcount(refinement, refinementCount);
+                       BATsetcount(refinement, refinementCount);
+
+               }               
+               
                BATseqbase(BATmirror(refinement), left->tseqbase);
                refinement = VIEWcreate(BATmark(right, oid_nil),refinement);
 
+               
+               if(0) printf ("%s setting residuals of %d to %p\n", __func__, 
refinement->batCacheid, getDecomposedBATSlot(refinement)->residuals);
                BATsetprop(refinement, batRegistryIndex, TYPE_int, 
(int[]){getNextFreeDecomposedBATSlotIndex()});
-               
                getDecomposedBATSlot(refinement)->residuals = filteredResiduals;
-               if(0) printf ("%s setting residuals of %d to %p\n", __func__, 
refinement->batCacheid, getDecomposedBATSlot(refinement)->residuals);
-               getDecomposedBATSlot(refinement)->approximationBits = 
approximationBits;
-
-
+               getDecomposedBATSlot(refinement)->approximationBits = 
batTailApproximationBits(left);
+               getDecomposedBATSlot(refinement)->tailOffsetBits = 
batTailOffsetBits(left);
 
                free(supersetPositionsColumn);
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to