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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list