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

* returning correct results for a simple select query now


Unterschiede (117 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
@@ -116,6 +116,13 @@ typedef union {
        } longIndexed;
 } indexedValue;
 
+char* approximateOperation(char* exactOperation){
+       if (exactOperation[1] == '\0') 
+    return exactOperation[0] == '<' ? "<=": ">=";
+       else
+               return exactOperation;
+}
+
 str BWDThetauselectApproximate(bat *res, bat *bid, ptr val, str *OP) {
        BAT* data = BATdescriptor(*bid);
        assert(BATttype(data) == TYPE_int); // type specific
@@ -157,7 +164,7 @@ str BWDThetauselectApproximate(bat *res,
                        "  }"
                        "}";
                char* sourceCode = malloc(16384);
-               snprintf(sourceCode, 16384, sourceCodeTemplate, 
typeNames[BATttype(data)], *OP, batTailApproximationBits(data)/8, 
32-batTailApproximationBits(data));
+               snprintf(sourceCode, 16384, sourceCodeTemplate, 
typeNames[BATttype(data)], approximateOperation(*OP), 
batTailApproximationBits(data)/8, 32-batTailApproximationBits(data));
                THRprintf(GDKout, "#%s, sourceCode: %s;\n", __func__, 
sourceCode);
                cl_int err;
                cl_program program = clCreateProgramWithSource(getCLContext(), 
1, (const char*[]){sourceCode}, (size_t[]){strlen(sourceCode)}, &err);
@@ -177,7 +184,7 @@ str BWDThetauselectApproximate(bat *res,
                if(err) THRprintf(GDKout, "#%s, clCreateKernel: %s;\n", 
__func__, clError(err));
                err = clSetKernelArg(selectKernel, 0, sizeof(cl_mem), 
(cl_mem[]){batTailApproximation(result)}); if (err) THRprintf(GDKout, "#%s, 
clSetKernelArg(%d): %s;\n", __func__, 0, clError(err));
                err = clSetKernelArg(selectKernel, 1, sizeof(cl_mem), 
(cl_mem[]){batTailApproximation(data)}); if (err) THRprintf(GDKout, "#%s, 
clSetKernelArg(%d): %s;\n", __func__, 1, clError(err));
-               err = clSetKernelArg(selectKernel, 2, sizeof(int), val); if 
(err) THRprintf(GDKout, "#%s, clSetKernelArg(%d): %s;\n", __func__, 2, 
clError(err));
+               err = clSetKernelArg(selectKernel, 2, sizeof(int), 
(int[]){((*(int*)val)>>batTailResidualBits(data))<<batTailResidualBits(data)}); 
if (err) THRprintf(GDKout, "#%s, clSetKernelArg(%d): %s;\n", __func__, 2, 
clError(err)); // type specific
 
                /* cl_mem outputCursor; */
                /* { */
@@ -217,21 +224,35 @@ str BWDThetauselectRefine(bat *res, bat 
        int* resultRegion = (int*) Tloc(result, BUNfirst(result)); // type 
specific
        oid* positionRegion = (oid*) Hloc(result, BUNfirst(result)); // type 
specific
        size_t candidateCount = resultClBAT->count;
+       /* const register unsigned int residualBits = 32-approximationBits; */
+       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;
        int i = 0, j = 0;
-       /* const register unsigned int residualBits = 32-approximationBits; */
-       const register unsigned int approximationMask = ~((1 << (32 - 
batTailApproximationBits(approximation)))-1);
 
-       while(i < candidateCount) {
-               const int offset = (clDeviceAddressBytes() + 
batTailApproximationBits(approximation)/8)*i++;
-               /* printf ("offset: %d\n", offset); */
-               const int index = *(int*)&resultClBAT->elements[offset]; // 
-               const int compressedValue = 
*(int*)&(resultClBAT->elements[clDeviceAddressBytes()+offset]);
-               /* const int bm = ~((int)255); */
-               positionRegion[j] = index;
-    resultRegion[j++] = compressedValue << (32 - 
batTailApproximationBits(approximation));
-               printf ("compressed value: %d, index: %d, value: %d\n", 
compressedValue, index, resultRegion[j-1]);
+#define refineLoop(comparator) while(i < candidateCount) {                     
                                \
+               const int offset = (clDeviceAddressBytes() + 
batTailApproximationBits(approximation)/8)*i++; \
+               const int index = *(int*)&resultClBAT->elements[offset];        
                                \
+               const int compressedValue = 
*(int*)&(resultClBAT->elements[clDeviceAddressBytes()+offset]); \
+               const int deCompressedValue = (compressedValue << 
batTailResidualBits(approximation)) + (*(int*)&residuals[index*residualBytes] & 
residualMask); \
+               if(deCompressedValue comparator *(int*)val) {                   
                                                                                
        \
+               positionRegion[j] = index; \
+    resultRegion[j++] = deCompressedValue; \
+               printf ("compressed value: %d, index: %d, value: %d\n", 
compressedValue, index, resultRegion[j-1]); \
+               }\
+}
+
+       switch (*OP[0]){
+       case '<': 
+               refineLoop(<);
+       case '>': 
+               refineLoop(>);
+       case '=': 
+               refineLoop(==);
        }
-       BATsetcount(result, resultClBAT->count);
+#undef refineLoop
+       BATsetcount(result, j);
        free(resultClBAT);
        
 
diff --git a/monetdb5/extras/bwd/utilities.c b/monetdb5/extras/bwd/utilities.c
--- a/monetdb5/extras/bwd/utilities.c
+++ b/monetdb5/extras/bwd/utilities.c
@@ -139,6 +139,9 @@ const size_t batTailApproximationBits(co
                return 
bwdRegistry[rightTailApproximationProperty->v.val.ival].approximationBits;
 }
 
+const size_t batTailResidualBits(const BAT* subject){
+       return ATOMsize(subject->ttype)*8 - batTailApproximationBits(subject);
+}
 const unsigned char* batTailResiduals(const BAT* subject){
                PROPrec* rightTailApproximationProperty;
                if(!(rightTailApproximationProperty = BATgetprop(subject, 
batRegistryIndex))){
@@ -177,7 +180,8 @@ const unsigned int decomposeIntArray(con
        const register unsigned int residualMask = (1 << residualBits)-1;
        int i;
        for (i = 0; i < size; ++i){
-               *((unsigned int*)(slot->residuals + i*residualBytes)) |= 
((subject[i]&residualMask)<<approximationBits);
+               *((unsigned int*)(slot->residuals + i*residualBytes)) |= 
(subject[i]&residualMask);
+               /* *((unsigned int*)(slot->residuals + i*residualBytes)) |= 
((subject[i]&residualMask)<<approximationBits); */
                *((unsigned int*)(approximation + i*approximationBytes)) |= 
(subject[i] >> residualBits);
        }
        {
diff --git a/monetdb5/extras/bwd/utilities.h b/monetdb5/extras/bwd/utilities.h
--- a/monetdb5/extras/bwd/utilities.h
+++ b/monetdb5/extras/bwd/utilities.h
@@ -17,6 +17,7 @@ const unsigned int getNextFreeDecomposed
 const char batTailIsDecomposed(const BAT*);
 const cl_mem batTailApproximation(const BAT*);
 const size_t batTailApproximationBits(const BAT*);
+const size_t batTailResidualBits(const BAT* subject);
 const unsigned char* batTailResiduals(const BAT*);
 
 const unsigned int decomposeIntArray(const int* subject, const size_t size, 
const size_t approximationBits);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to