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

* (hopefully) fixed projective semijoins


Unterschiede (166 Zeilen):

diff --git a/monetdb5/extras/bwd/cl_program_utilities.c 
b/monetdb5/extras/bwd/cl_program_utilities.c
--- a/monetdb5/extras/bwd/cl_program_utilities.c
+++ b/monetdb5/extras/bwd/cl_program_utilities.c
@@ -61,17 +61,17 @@ cl_program getProjectionLeftjoinProgram(
        const char* sourceCode = "__kernel void project (\n"
                "__global struct{int count; int padding; char values[];}* 
outputTail,\n"
                "__global struct{int count; int padding; int positions[];}* 
inputTail,"
-               "__global const struct{int count; int padding; char values[];}* 
approximationTail\n) {\n"
+               "__global const struct{int count; int base; char values[];}* 
approximationTail\n) {\n"
                " if(get_global_id(0) < inputTail->count){\n"
                " __global const char* approximation = 
approximationTail->values;"
                "  const int offset = 
inputTail->positions[get_global_id(0)]*approximationBytes;\n"
-               "  int value = 0;"
+               "  int value = approximationTail->base;"
                "  for(int i = 0; i < approximationBytes; i++){\n"
                "    outputTail->values[get_global_id(0)*approximationBytes+i] 
= approximation[offset + i];\n"
                "    value += approximation[offset + i] << 8*i;"
                "  }\n"
+               /* "  printf(\"projected value (%d): %d (base: %d + %d + 
%d<<8), approximationBytes: %d\\n\", inputTail->positions[get_global_id(0)], 
value, approximationTail->base, approximation[offset], approximation[offset + 
1], approximationBytes);" */
                " }\n"
-               /* "  printf(\"projected value (%d): %d\\n\", 
inputTail->positions[get_global_id(0)], value<<(8*(4-approximationBytes)));" */
                "}";
                char options[64];
                snprintf(options, 64, "-D approximationBytes=%d", 
approximationBits/8-offsetBits/8);
@@ -111,7 +111,7 @@ cl_program getUSelectProgram(int type, c
                "    value += (approximation[inputOffset + i] << 
((i+sizeof(%1$s)-%6$d - %4$d)*8));\n"
                "\n"
                /* "  if(get_global_id(0) < 10)\n" */
-               /* "    printf(\"%%d, base: %%d\\n\", value, 
approximationTail->base);\n" */
+               /* "    printf(\"%%d: %%d, base: %%d\\n\", get_global_id(0), 
value, approximationTail->base);\n" */
                "  if((value %2$s operand)"
                "     && (%5$d || value %3$s operand2)"
                "    )"
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
@@ -19,6 +19,7 @@
 
 static const int activateWorkInProgress = 1;
 static const int synchronousGPU = 1;
+#define WORK_GROUP_SIZE 1
 
 #pragma mark Actual MAL Operations Implementation
 
@@ -136,7 +137,7 @@ str BWDLeftJoinApproximate(bat * res, ba
                                                        )))) printf("#%s, 
clSetKernelArg(%d): %s;\n", __func__, 0, clError(err));
                }
 
-               if((err = clEnqueueNDRangeKernel(getCommandQueue(), 
projectKernel, 1, (const size_t[]){0}, (const 
size_t[]){ceil(headCount/16.0)*16}, (const size_t[]){16}, 0, NULL, NULL)))
+               if((err = clEnqueueNDRangeKernel(getCommandQueue(), 
projectKernel, 1, (const size_t[]){0}, (const 
size_t[]){ceil(headCount/((float)WORK_GROUP_SIZE))*WORK_GROUP_SIZE}, (const 
size_t[]){WORK_GROUP_SIZE}, 0, NULL, NULL)))
                        printf("#%s, clEnqueueNDRangeKernel: %s;\n", __func__, 
clError(err));
                if (synchronousGPU) clFinish(getCommandQueue());
 
@@ -151,16 +152,18 @@ str BWDLeftJoinApproximate(bat * res, ba
        return MAL_SUCCEED;
 };
 
-static inline int decompressIntValue(const int i, const int approximationbits, 
const clTail* compressedTail, const unsigned char* residuals, const int 
residualI){
+static inline int decompressIntValue(const int i, const int approximationbits, 
const int offsetBits, 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;
        const unsigned int residualBytes = residualBits/8;
+       const int approximationBytes = approximationbits/8-offsetBits/8;
+       const int approximationMask = (1<<(approximationBytes*8))-1;
 
 
-       const int offset = (approximationbits/8)*i; 
-       const int compressedValue = 
compressedTail->base+*(int*)&(compressedTail->elements[offset]); 
-       const int deCompressedValue = (compressedValue << residualBits) + 
(*(int*)&residuals[residualI*residualBytes] & residualMask);
+       const int offset = approximationBytes*i; 
+       const int compressedValue = *(int*)&(compressedTail->elements[offset]) 
& approximationMask; 
+       const int deCompressedValue = compressedTail->base + (compressedValue 
<< residualBits) + (*(int*)&residuals[residualI*residualBytes] & residualMask);
        return deCompressedValue;
 }
 
@@ -177,6 +180,7 @@ str BWDLeftJoinRefine(bat * res, bat * l
        BAT* refinement;
        BAT* approximation = BATdescriptor(*approx);
        const register size_t approximationBits = 
batTailApproximationBits(right);
+       const register size_t offsetBits = batTailOffsetBits(right);
                /* BATnew(approximation->htype, approximation->ttype, 
approximation->batCount); */
        if(0 && BAThvoid(left) && BATtvoid(left) && BAThvoid(right) && 
right->tseqbase != oid_nil){
                // not very likely optimization, hence disabled
@@ -215,7 +219,7 @@ str BWDLeftJoinRefine(bat * res, bat * l
                int i;
                for (i = 0; i < supersetPositionsColumn->count; ++i) {
                        if(supersetPositionsColumn->positions[i] == 
*positionRegion){
-                               refinementRegion[refinementCount++] = 
decompressIntValue(i, approximationBits, supersetApproximateValuesColumn, 
residuals, *positionRegion);
+                               refinementRegion[refinementCount++] = 
decompressIntValue(i, approximationBits, offsetBits, 
supersetApproximateValuesColumn, residuals, *positionRegion);
                                positionRegion++;
                        }
                }
@@ -298,7 +302,7 @@ static inline str uselect(bat *res, bat 
                        if((err = clSetKernelArg(selectKernel, 3+i, 
sizeof(int), &(parameters[i]))))  // type specific
                                printf("#%s, clSetKernelArg(%d): %s;\n", 
__func__, 3+i, clError(err));
 
-               err = clEnqueueNDRangeKernel(getCommandQueue(), selectKernel, 
1, (const size_t[]){0}, (const size_t[]){ceil(dataCount/16.0)*16}, (const 
size_t[]){16}, 0, NULL, NULL);
+               err = clEnqueueNDRangeKernel(getCommandQueue(), selectKernel, 
1, (const size_t[]){0}, (const 
size_t[]){ceil(dataCount/((float)WORK_GROUP_SIZE))*WORK_GROUP_SIZE}, (const 
size_t[]){WORK_GROUP_SIZE}, 0, NULL, NULL);
                if(err) printf("#%s, clEnqueueNDRangeKernel: %s;\n", __func__, 
clError(err));
                if (synchronousGPU) clFinish(getCommandQueue());
                if(0){
@@ -360,6 +364,8 @@ str uselectrefine(bat *res, bat *bid, pt
                                for (i = 0; i < candidateCount; ++i) 
                                        positionRegion[i] = headPositions[i];
                                BATsetcount(result, candidateCount);
+                               BATseqbase(BATmirror(result), oid_nil);
+
                        } else {
 
 
@@ -527,7 +533,7 @@ str BWDSemijoinApproximate(int *res, int
                cl_mem positionColumn = batTailPositions(right);
                if(!positionColumn) positionColumn = 
batHeadApproximation(BATmirror(right));
 
-               cl_program program = 
getProjectionLeftjoinProgram(batTailApproximationBits(right), 
batTailOffsetBits(right)); // turns out this case is actually a simple 
projection and a reuse of the right head column
+               cl_program program = 
getProjectionLeftjoinProgram(batTailApproximationBits(left), 
batTailOffsetBits(left)); // turns out this case is actually a simple 
projection and a reuse of the right head column
 
 
                cl_int err;
@@ -568,7 +574,7 @@ str BWDSemijoinApproximate(int *res, int
                                                                        
batTailApproximation(result), positionColumn, rightColumn}[i]
                                                                )))) 
printf("#%s, clSetKernelArg(%d): %s;\n", __func__, 0, clError(err));
                if(headCount)
-                       if((err = clEnqueueNDRangeKernel(getCommandQueue(), 
projectKernel, 1, (const size_t[]){0}, (const 
size_t[]){ceil(headCount/16.0)*16}, (const size_t[]){16}, 0, NULL, NULL)))
+                       if((err = clEnqueueNDRangeKernel(getCommandQueue(), 
projectKernel, 1, (const size_t[]){0}, (const 
size_t[]){ceil(headCount/((float)WORK_GROUP_SIZE))*WORK_GROUP_SIZE}, (const 
size_t[]){WORK_GROUP_SIZE}, 0, NULL, NULL)))
                                printf("#%s, clEnqueueNDRangeKernel: %s;\n", 
__func__, clError(err));
                        if(0) printf ("returning approximation with tail 
positions %p\n", batTailPositions(result));
                        if (synchronousGPU) clFinish(getCommandQueue());
@@ -602,6 +608,7 @@ str BWDSemijoinRefine(int *res, int *lid
        BAT* right = BATdescriptor(*rid);
        BAT* approximation = BATdescriptor(*approx);
        const size_t approximationBits = batTailApproximationBits(left);
+       const size_t offsetBits = batTailOffsetBits(left);
 
        BAT* refinement;
        if(BAThvoid(left)  && ATOMstorage(BATttype(left)) == TYPE_int && 
BAThtype(right) == TYPE_oid){ // TODO: type specific
@@ -613,14 +620,15 @@ str BWDSemijoinRefine(int *res, int *lid
                getPositionsColumn(batTailPositions(approximation), NULL, 
&bufferSize);
                clHead* supersetPositionsColumn = 
getPositionsColumn(batTailPositions(approximation), malloc(bufferSize), 
&bufferSize);
                unsigned char* filteredResiduals = NULL;
+               getApproximateValuesColumn(batTailApproximation(approximation), 
NULL, &bufferSize);
+               clTail* supersetApproximateValuesColumn = 
getApproximateValuesColumn(batTailApproximation(approximation), 
malloc(bufferSize), &bufferSize);
 
-               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);
+               if(0 && 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 {
 
-                       
getApproximateValuesColumn(batTailApproximation(approximation), NULL, 
&bufferSize);
-                       clTail* supersetApproximateValuesColumn = 
getApproximateValuesColumn(batTailApproximation(approximation), 
malloc(bufferSize), &bufferSize);
 
                        size_t refinementCount = 0;
                        if(supersetPositionsColumn){
@@ -636,7 +644,7 @@ str BWDSemijoinRefine(int *res, int *lid
                                        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]);
+                                               
refinementRegion[refinementCount++] = decompressIntValue(i, approximationBits, 
offsetBits, supersetApproximateValuesColumn, residuals, 
supersetPositionsColumn->positions[i]);
                                        }
                                }
                        }else {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to