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

* fixed selection on non-dense-headed bats (TPCH Q6 now runs correctly on the 
first 10 lineitems :-))


Unterschiede (155 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
@@ -41,7 +41,7 @@ cl_program compileProgram(const char* so
 
 cl_program getMultiplyProgram(unsigned int approximationBits){
        const char* sourceCode = "__kernel void project (\n"
-               "__global struct{int count; int padding; char values[];}* 
outputTail,\n"
+               "__global struct{int count; int base; char values[];}* 
outputTail,\n"
                "__global const struct{int count; int padding; char values[];}* 
inputTail1,"
                "__global const struct{int count; int padding; char values[];}* 
inputTail2\n) {\n"
                "  const int offset = get_global_id(0)*approximationBytes;\n"
@@ -59,18 +59,18 @@ 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 padding; char values[];}* 
outputTail,\n"
+               "__global struct{int count; int base; char values[];}* 
outputTail,\n"
                "__global struct{int count; int padding; int positions[];}* 
inputTail,"
                "__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 = approximationTail->base;"
+               /* "  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;"
+               /* "    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);" */
+               /* "  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];
@@ -93,9 +93,46 @@ cl_program getProjectionLeftjoinProgram(
 /*     return compileProgram(sourceCode, options); */
 /* } */
 
-cl_program getUSelectProgram(int type, char* predicateOperation, char* 
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits){
+cl_program getUSelectProgram(int type, char* predicateOperation, char* 
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits, 
char inputIsVoidHeaded){
 
-       const char* sourceCodeTemplate = "__kernel void uselect (\n"
+       const char* sourceCodeTemplates[] = {
+               [0] = "__kernel void uselect (\n"
+               "__global struct{int count; int padding; int positions[];}* 
outputHead,\n"
+               "__global struct{int count; int base; char values[];}* 
outputTail,\n"
+               "__global const struct{int count; int base; char values[];}* 
approximationTail,\n"
+               "__global const struct{int count; int padding; int 
positions[];}* approximationHead\n"
+               ",\n"
+               "const %1$s operand,\n"
+               "const %1$s operand2\n"
+               ") {\n"
+               " if(get_global_id(0) < approximationTail->count){\n"
+               " __global const char* approximation = 
approximationTail->values;"
+               "  %1$s value  = approximationTail->base;\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"
+               "\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"
+               "    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"
+               "    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"
+               "      outputTail->values[offset+i] = approximation[inputOffset 
+ i];\n"
+               /* "      printf(\"set byte %%d to %%d\\n\", 
offset+i,outputTail->values[offset+i]);" */
+               "    }\n"
+               "  } else {\n"
+               "    printf(\"not selected value %%d (base: %%d, outbase: %%d) 
from slot %%d, head value: %%d\\n\", value, approximationTail->base, 
outputTail->base, get_global_id(0), 
approximationHead->positions[get_global_id(0)]);\n"
+               "  }"
+               " }\n"
+               "}",
+               [1] = "__kernel void uselect (\n"
                "__global struct{int count; int padding; int positions[];}* 
outputHead,\n"
                "__global struct{int count; int base; char values[];}* 
outputTail,\n"
                "__global const struct{int count; int base; char values[];}* 
approximationTail\n"
@@ -127,11 +164,11 @@ cl_program getUSelectProgram(int type, c
                "    }\n"
                "  }\n"
                " }\n"
-               "}";
+               "}"
+       };
        char* sourceCode = malloc(16384);
-       snprintf(sourceCode, 16384, sourceCodeTemplate, (str[]){[TYPE_int] = 
"int"}[type], approximateOperation(predicateOperation), 
predicateOperation2?approximateOperation(predicateOperation2):"==", 
approximationBits/8-offsetBits/8, predicateOperation2 == NULL?1:0, 
offsetBits/8);
+       snprintf(sourceCode, 16384, sourceCodeTemplates[inputIsVoidHeaded>0], 
(str[]){[TYPE_int] = "int"}[type], approximateOperation(predicateOperation), 
predicateOperation2?approximateOperation(predicateOperation2):"==", 
approximationBits/8-offsetBits/8, predicateOperation2 == NULL?1:0, 
offsetBits/8);
        cl_program program = compileProgram(sourceCode,"");
-       printf ("%s\n", sourceCode);
        free(sourceCode);
        return program;
 }
diff --git a/monetdb5/extras/bwd/cl_program_utilities.h 
b/monetdb5/extras/bwd/cl_program_utilities.h
--- a/monetdb5/extras/bwd/cl_program_utilities.h
+++ b/monetdb5/extras/bwd/cl_program_utilities.h
@@ -8,7 +8,7 @@
 #endif
 
 
-cl_program getUSelectProgram(int type, char* predicateOperation, char* 
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits);
+cl_program getUSelectProgram(int type, char* predicateOperation, char* 
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits, 
char inputIsVoidHeaded);
 cl_program getProjectionLeftjoinProgram(unsigned int approximationBits, 
unsigned int offsetBits);
 cl_program compileProgram(const char* sourceCode, char* options);
 /* cl_program getProjectionSemijoinProgram(unsigned int approximationBits); */
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
@@ -282,25 +282,32 @@ static inline str uselect(bat *res, bat 
 
                }
 
-               cl_program program = 
getUSelectProgram(ATOMstorage(BATttype(data)), OP, OP2, 
batTailApproximationBits(data), batTailOffsetBits(data));
+               cl_program program = 
getUSelectProgram(ATOMstorage(BATttype(data)), OP, OP2, 
batTailApproximationBits(data), batTailOffsetBits(data),data->H->type == 
TYPE_void);
 
                int err;
 
                cl_kernel selectKernel = clCreateKernel(program, "uselect", 
&err);
                if(err) printf("#%s, clCreateKernel: %s;\n", __func__, 
clError(err));
                cl_mem buffers[3] = {batHeadApproximation(result),
-                               batTailApproximation(result),
+                                                                               
                 batTailApproximation(result),
                                                                                
                 batTailApproximation(data)};
-               int i;
-               for ( i = 0; i < 3; ++i) 
-                       if((err = clSetKernelArg(selectKernel, i, 
sizeof(cl_mem), &(buffers[i]))))
-                               printf("#%s, clSetKernelArg(%d): %s;\n", 
__func__, i, clError(err));
+               int bufferI;
+               for ( bufferI = 0; bufferI < 3; ++bufferI) 
+                       if((err = clSetKernelArg(selectKernel, bufferI, 
sizeof(cl_mem), &(buffers[bufferI]))))
+                               printf("#%s, clSetKernelArg(%d): %s;\n", 
__func__, bufferI, clError(err));
+               if (data->H->type != TYPE_void) {
+                       if((err = clSetKernelArg(selectKernel, bufferI, 
sizeof(cl_mem), (cl_mem[]){batHeadApproximation(data)})))
+                               printf("#%s, clSetKernelArg(%d): %s;\n", 
__func__, bufferI, clError(err));
+                       bufferI++;
+               }
+               
                const int parameters[2] = {
                                        
((*(int*)val)>>batTailResidualBits(data))<<batTailResidualBits(data),
                                        
val2?(((*(int*)val2)>>batTailResidualBits(data))<<batTailResidualBits(data)):0};
+               int i;
                for (i = 0; i < 2; ++i) 
-                       if((err = clSetKernelArg(selectKernel, 3+i, 
sizeof(int), &(parameters[i]))))  // type specific
-                               printf("#%s, clSetKernelArg(%d): %s;\n", 
__func__, 3+i, clError(err));
+                       if((err = clSetKernelArg(selectKernel, bufferI+i, 
sizeof(int), &(parameters[i]))))  // type specific
+                               printf("#%s, clSetKernelArg(%d): %s;\n", 
__func__, bufferI+i, clError(err));
 
                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));
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to