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

* smaller fixes for correctness


Unterschiede (180 Zeilen):

diff --git a/monetdb5/extras/bwd/bwd.c b/monetdb5/extras/bwd/bwd.c
--- a/monetdb5/extras/bwd/bwd.c
+++ b/monetdb5/extras/bwd/bwd.c
@@ -102,15 +102,17 @@ str bwdecompose(bat * res, bat * subject
        BAT* subject = BATdescriptor(*subjectBAT);
        if (VIEWtparent(subject)) 
     subject = BATdescriptor(abs(VIEWtparent(subject)));
+       BAT* result = BATnew(TYPE_void, TYPE_str, 0);
+       char buffer[4096];
        if(! batTailIsDecomposed(subject)){
                printf ("decomposing %s into %d and %d bits\n", 
resolveBatToAttribute(subject->batCacheid, cntxt), approximationBits[0], 
Tsize(subject)*8-*approximationBits);
                BATsetprop(subject, batRegistryIndex, TYPE_int, 
(int[]){decomposeIntArray((int*)Tloc(subject, BUNfirst(subject)), 
subject->batCount, *approximationBits)});
-               BAT* result = BATnew(TYPE_void, TYPE_str, 0);
-               char buffer[4096];
                snprintf(buffer, 4096, "successfully decomposed bat %d", 
subject->batCacheid);
-               BUNappend(result, buffer, 0);
-               BBPkeepref(*res = result->batCacheid);
+       } else {
+               snprintf(buffer, 4096, "bat %d already decomposed", 
subject->batCacheid);
        }
+       BUNappend(result, buffer, 0);
+       BBPkeepref(*res = result->batCacheid);
        BBPreleaseref(subject->batCacheid);
        return MAL_SUCCEED;
 }
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
@@ -24,6 +24,8 @@ char* approximateOperation(char* exactOp
 static inline void superverboseprintf(const char * format, ... ){};
 
 cl_program compileProgram(const char* sourceCode, char* options){
+       struct timespec before, after;
+       clock_gettime(CLOCK_THREAD_CPUTIME_ID, &before);
        cl_int err;
        cl_program program = clCreateProgramWithSource(getCLContext(), 1, 
(const char*[]){sourceCode}, (size_t[]){strlen(sourceCode)}, &err);
        if(err) THRprintf(GDKout, "#%s, clCreateProgramWithSource: %s;\n", 
__func__, clError(err));
@@ -36,6 +38,9 @@ cl_program compileProgram(const char* so
                clGetProgramBuildInfo(program, getDeviceID(), 
CL_PROGRAM_BUILD_LOG, bufferSize, (buffer = alloca(bufferSize)), NULL);
                printf("#%s, clBuildProgram log: %s;\n", __func__, buffer);
        }
+       clock_gettime(CLOCK_THREAD_CPUTIME_ID, &after);
+       printf ("compilation took %ld 
nanoseconds\n",(after.tv_sec*1000000000+after.tv_nsec)-(before.tv_sec*1000000000+before.tv_nsec));
+
        return program;
 }
 
@@ -58,24 +63,41 @@ cl_program getMultiplyProgram(unsigned i
 }
 
 cl_program getProjectionLeftjoinProgram(unsigned int approximationBits, 
unsigned int offsetBits){
-       const char* sourceCode = "__kernel void project (\n"
-               "__global struct{int count; int base; unsigned char values[];}* 
outputTail,\n"
-               "__global struct{int count; int padding; int positions[];}* 
inputTail,"
-               "__global const struct{int count; int base; unsigned char 
values[];}* approximationTail\n) {\n"
-               " if(get_global_id(0) < inputTail->count){\n"
-               " __global const unsigned char* approximation = 
approximationTail->values;"
-               "  const int offset = 
inputTail->positions[get_global_id(0)]*approximationBytes;\n"
-               /* "  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+1);" */
-               "  }\n"
-               /* "  printf(\"projected value (%d): %d (base: %d + %d + %d<<8, 
outbase: %d), approximationBytes: %d\\n\", 
inputTail->positions[get_global_id(0)], value, approximationTail->base, 
approximation[offset], approximation[offset + 1], outputTail->base, 
approximationBytes);" */
-               " }\n"
-               "}";
+       static cl_program programCache[4] = {};
+
+       if(programCache[approximationBits/8-offsetBits/8] == NULL){
+               const char* sourceCode = "__kernel void project (\n"
+                       "#if approximationBytes == 2\n"
+                       "__global struct{int count; int base; unsigned short 
values[];}* outputTail,\n"
+                       "#else\n"
+                       "__global struct{int count; int base; unsigned char 
values[];}* outputTail,\n"
+                       "#endif\n"
+                       "__global struct{int count; int padding; int 
positions[];}* inputTail,\n"
+                       "#if approximationBytes == 2\n"
+                       "__global const struct{int count; int base; unsigned 
short values[];}* approximationTail\n) {\n"
+                       "#else\n"
+                       "__global const struct{int count; int base; unsigned 
char values[];}* approximationTail\n) {\n"
+                       "#endif\n"
+                       " if(get_global_id(0) < inputTail->count){\n"
+                       /* "  int value = approximationTail->base;" */
+                       "#if approximationBytes == 2\n"
+                       "    outputTail->values[get_global_id(0)] = 
approximationTail->values[inputTail->positions[get_global_id(0)]];\n"
+                       "#else\n"
+                       " __global const unsigned char* approximation = 
approximationTail->values;\n"
+                       "  const int offset = 
inputTail->positions[get_global_id(0)]*approximationBytes;\n"
+                       "  for(int i = 0; i < approximationBytes; i++){\n"
+                       "    
outputTail->values[get_global_id(0)*approximationBytes+i] = 
approximation[offset + i];\n"
+                       "  }\n"
+                       "#endif\n"
+                       /* "    value += approximation[offset + i] << 8*(i+1);" 
*/
+                       /* "  printf(\"projected value (%d): %d (base: %d + %d 
+ %d<<8, outbase: %d), approximationBytes: %d\\n\", 
inputTail->positions[get_global_id(0)], value, approximationTail->base, 
approximation[offset], approximation[offset + 1], outputTail->base, 
approximationBytes);" */
+                       " }\n"
+                       "}";
                char options[64];
                snprintf(options, 64, "-D approximationBytes=%d", 
approximationBits/8-offsetBits/8);
-               return compileProgram(sourceCode, options);
+               programCache[approximationBits/8-offsetBits/8] = 
compileProgram(sourceCode, options);
+       }
+       return programCache[approximationBits/8-offsetBits/8]; 
 }
 
 cl_program getUSelectProgram(int type, char* predicateOperation, char* 
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits, 
char inputIsVoidHeaded){
@@ -108,7 +130,7 @@ cl_program getUSelectProgram(int type, c
                "{\n"
                "    const int index = atomic_inc(&(outputHead->count));\n"
                "    atomic_inc(&(outputTail->count));\n" // TODO: this could 
probably be done more efficiently
-               "    printf(\"selected value %%d from slot %%d into slot %%d, 
head value_: %%d\\n\", value, get_global_id(0), index, 
approximationHead->positions[get_global_id(0)]);\n"
+               /* "    printf(\"selected value %%d from slot %%d into slot 
%%d, head value_: %%d\\n\", value, get_global_id(0), index, 
approximationHead->positions[get_global_id(0)]);\n" */
                "    const int offset = index * %4$d;\n"
                "    outputHead->positions[index] = 
approximationHead->positions[get_global_id(0)];\n"
                "    for(int i = 0; i < %4$d; i++){\n"
@@ -123,34 +145,41 @@ cl_program getUSelectProgram(int type, c
                "}",
                [1] = "__kernel void uselect (\n"
                "__global struct{int count; int padding; int positions[];}* 
outputHead,\n"
+               "#if %4$d == 2\n"
+               "__global struct{int count; int base; unsigned short 
values[];}* outputTail,\n"
+               "__global const struct{int count; int base; unsigned short 
values[];}* approximationTail,\n"
+               "#else\n"
                "__global struct{int count; int base; unsigned char values[];}* 
outputTail,\n"
-               "__global const struct{int count; int base; unsigned char 
values[];}* approximationTail\n"
-               ",\n"
+               "__global const struct{int count; int base; unsigned char 
values[];}* approximationTail,\n"
+               "#endif\n"
                "const %1$s operand,\n"
                "const %1$s operand2\n"
                ") {\n"
                " if(get_global_id(0) < approximationTail->count){\n"
-               " __global const unsigned char* approximation = 
approximationTail->values;"
+               /* " __global const unsigned char* approximation = 
approximationTail->values;" */
                "  %1$s value  = approximationTail->base;\n"
+               "#if %4$d == 2\n"
+               "    value += (approximationTail->values[get_global_id(0)] << 
((sizeof(%1$s)-%6$d - %4$d)*8));\n"
+               "#else\n"
                "  const size_t inputOffset = get_global_id(0)*%4$d;\n"
                "  for(int i = 0; i < %4$d; i++)\n"
-               "    value += (approximation[inputOffset + i] << 
((i+sizeof(%1$s)-%6$d - %4$d)*8));\n"
+               "    value += (approximationTail->values[inputOffset + i] << 
((i+sizeof(%1$s)-%6$d - %4$d)*8));\n"
+               "#endif\n"
                "\n"
-               /* "  if(get_global_id(0) < 10)\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)"
-               "    )"
-               "{\n"
+               "    ){\n"
                "    const int index = atomic_inc(&(outputHead->count));\n"
                "    atomic_inc(&(outputTail->count));\n" // TODO: this could 
probably be done more efficiently
-               /* "    printf(\"selected value %%d from slot %%d into slot 
%%d\\n\", value, get_global_id(0), index);\n" */
+               "    outputHead->positions[index] = get_global_id(0);\n"
+               "#if %4$d == 2\n"
+               "    outputTail->values[index] = 
approximationTail->values[get_global_id(0)];\n"
+               "#else\n"
                "    const int offset = index * %4$d;\n"
-               "    outputHead->positions[index] = get_global_id(0);\n"
                "    for(int i = 0; i < %4$d; i++){\n"
-               "      outputTail->values[offset+i] = approximation[inputOffset 
+ i];\n"
-               /* "      printf(\"set byte %%d to %%d\\n\", 
offset+i,outputTail->values[offset+i]);" */
+               "      outputTail->values[offset+i] = 
approximationTail->values[inputOffset + i];\n"
                "    }\n"
+               "#endif\n"
                "  }\n"
                " }\n"
                "}"
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
@@ -468,7 +468,7 @@ str uselectrefine(bat *res, bat *bid, pt
                                                const int compressedValue = 
*(int*)&(compressedTail->elements[offset]) & tailApproximationMask; \
                                                const int deCompressedValue =   
compressedTail->base+                                   \
                                                        (compressedValue << 
tailResidualBits)                                                               
                    \
-                                                       + 
(*(int*)&residuals[index*residualBytes] & residualMask); \
+                                                       + 
(*(int*)&residuals[i*residualBytes] & residualMask); \
                                                {                               
                                                                                
                                                                                
                                                \
                                                        positionRegion[j] = 
index;                                                                          
                                                    \
                                                        j+= ((deCompressedValue 
comparator value1) &                                                    \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to