Changeset: 7f88e30cce54 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7f88e30cce54
Modified Files:
monetdb5/extras/bwd/cl_program_utilities.c
monetdb5/extras/bwd/operations.c
monetdb5/extras/bwd/utilities.c
Branch: bwd
Log Message:
* still working on true bitwise decomposition (largely fixing result
correctness bugs)
Unterschiede (gekürzt von 413 auf 300 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
@@ -25,6 +25,10 @@ char* approximateOperation(char* exactOp
return exactOperation;
}
+/* static const str typeNames[] = {[TYPE_int] = "int"}; */
+static const size_t typeSizes[] = {[TYPE_int] = sizeof(int)};
+
+
static inline void superverboseprintf(const char * format, ... ){};
cl_program compileProgram(const char* sourceCode, char* options){
@@ -49,6 +53,8 @@ cl_program compileProgram(const char* so
return program;
}
+
+
cl_program getMultiplyProgram(unsigned int approximationBits){
const char* sourceCode = "__kernel void project (\n"
"__global struct{int count; int base; unsigned char values[];}*
outputTail,\n"
@@ -71,35 +77,56 @@ cl_program getProjectionLeftjoinProgram(
static cl_program programCache[4][8] = {}; //TODO: limited to four
devices
const int deviceForThisThread = getGPUDeviceForThisThread();
if(programCache[deviceForThisThread][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"
+ const char* sourceCode = ""
+ "#define accessType unsigned int\n"
+ " __constant static const size_t approximationBits =
(approximationBytes*8);\n"
+ " __constant static const size_t targetTypeBits =
(sizeof(accessType)*8);\n"
+ " __constant static const unsigned int
approximationMask = ((1<<approximationBits)-1);\n"
+ "__kernel void project (\n"
+ "__global struct{int count; int base; unsigned int
values[];}* outputTail,\n"
+ "__global struct{int count; int padding; unsigned int
positions[];}* inputTail,\n"
+ "__global const struct{int count; int base; unsigned
int values[];}* approximationTail\n) {\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"
+ /* "#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" */
+ " const size_t inputIndex =
inputTail->positions[get_global_id(0)];"
+ " size_t slot =
(inputIndex*approximationBits)/targetTypeBits;\n"
+ " size_t offset =
(inputIndex*approximationBits)%targetTypeBits;\n"
+ /* " printf(\"getting position %u\\n\",
get_global_id(0));\n" */
+ " __global const unsigned int* vals =
approximationTail->values;\n"
+ " unsigned int delta = (("
+ "
(((offset+approximationBits)>targetTypeBits)?((vals[slot]<<(targetTypeBits-offset))
+ vals[slot+1]>>(approximationBits-targetTypeBits+offset)):0)\n"
+ /* "0" */
+ " +
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
+ " )&approximationMask);\n"
+ /* " printf(\"projected delta #%u: %u\\n\",
get_global_id(0), delta);\n" */
+
+ " const size_t index = get_global_id(0);\n"
+ " size_t outslot =
(index*approximationBits)/targetTypeBits;\n"
+ " size_t outoffset =
(index*approximationBits)%targetTypeBits;\n"
+ " if(outoffset+approximationBits >
8*sizeof(accessType))"
+ " outputTail->values[outslot] |= (delta <<
(approximationBits-(8*sizeof(accessType)-outoffset)));"
+ " else"
+ " outputTail->values[outslot] |= (delta <<
(8*sizeof(accessType)-outoffset-approximationBits));"
/* " value += approximation[offset + i] << 8*(i+1);"
*/
+ " int value =
approximationTail->base+(delta<<residualBits);"
+ " if(index<10)"
+ " printf(\"%d->%d: offset+(%d>>x)=%d,
val[slot=%u]=%u, %d\\n\", inputIndex, get_global_id(0), delta, value, outslot,
outputTail->values[outslot],
(8*sizeof(accessType)-outoffset-approximationBits));"
+
/* " 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);
+ char options[256];
+ int type = TYPE_int;
+ snprintf(options, 256, "-D approximationBytes=%d -D
residualBits=%lu", approximationBits/8-offsetBits/8,
typeSizes[type]*8-approximationBits);
programCache[deviceForThisThread][approximationBits/8-offsetBits/8] =
compileProgram(sourceCode, options);
}
return
programCache[deviceForThisThread][approximationBits/8-offsetBits/8];
@@ -108,7 +135,9 @@ cl_program getProjectionLeftjoinProgram(
cl_program getUSelectProgram(int type, char* predicateOperation, char*
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits,
char inputIsVoidHeaded){
const char* sourceCodeTemplates[] = {
- [0] = "__kernel void uselect (\n" // non-void-headed case
+ [0] = " __constant static const size_t targetTypeBits =
(sizeof(targetType)*8);\n"
+ " __constant static const unsigned int approximationMask =
((1<<approximationBits)-1);\n"
+ "__kernel void uselect (\n" // non-void-headed case
"__global struct{int count; int padding; int positions[];}*
outputHead,\n"
"__global struct{int count; int base; unsigned char values[];}*
outputTail,\n"
"__global const struct{int count; int base; unsigned char
values[];}* approximationTail,\n"
@@ -118,12 +147,22 @@ cl_program getUSelectProgram(int type, c
"const %1$s operand2\n"
") {\n"
" if(get_global_id(0) < approximationTail->count){\n"
+ " __global const unsigned int* vals =
approximationTail->values;\n"
" __global const unsigned 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"
+ /* " for(int i = 0; i < %4$d; i++){\n" */
+ /* " value += (approximation[inputOffset + i] <<
((i+sizeof(%1$s)-%6$d - %4$d)*8));\n" */
+ /* "}\n" */
+ " size_t slot =
(get_global_id(0)*approximationBits)/targetTypeBits;\n"
+ " size_t offset =
(get_global_id(0)*approximationBits)%%targetTypeBits;\n"
+
+
+ " value += ((("
+ "
(((offset+approximationBits)>targetTypeBits)?((vals[slot]<<(targetTypeBits-offset))
+ vals[slot+1]>>(approximationBits-targetTypeBits+offset)):0)\n"
+ " +
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
+ " )&approximationMask)<<residualBits);\n"
+
" if((value %2$s operand)"
" && (%5$d || value %3$s operand2)"
" )"
@@ -180,11 +219,12 @@ cl_program getUSelectProgram(int type, c
" }\n"
"}",
- [2] = " __constant static const size_t targetTypeBits =
(sizeof(targetType)*8);\n"
+ [2] = "#define accessType unsigned int\n"
+ " __constant static const size_t targetTypeBits =
(sizeof(targetType)*8);\n"
" __constant static const unsigned int approximationMask =
((1<<approximationBits)-1);\n"
"__kernel void uselect (\n" // void-headed case
"__global struct{int count; int padding; int positions[];}*
outputHead,\n"
- "__global struct{int count; int base; unsigned char values[];}*
outputTail,\n"
+ "__global struct{int count; int base; accessType values[];}*
outputTail,\n"
"__global const struct{int count; int base; unsigned char
values[];}* approximationTail,\n"
"const %1$s operand,\n"
"const %1$s operand2\n"
@@ -193,41 +233,42 @@ cl_program getUSelectProgram(int type, c
" targetType value = approximationTail->base;\n"
" size_t slot =
(get_global_id(0)*approximationBits)/targetTypeBits;\n"
" size_t offset =
(get_global_id(0)*approximationBits)%%targetTypeBits;\n"
- " {\n"
" __global const unsigned int* vals =
approximationTail->values;\n"
- " value += ((("
+ " unsigned int delta = (("
"
(((offset+approximationBits)>targetTypeBits)?((vals[slot]<<(targetTypeBits-offset))
+ vals[slot+1]>>(approximationBits-targetTypeBits+offset)):0)\n"
" +
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
- " )&approximationMask)<<residualBits);\n"
- /* " value += (((\n" */
- /* " +
((vals[slot]>>(targetTypeBits-offset-approximationBits))))&((1<<approximationBits)-1))<<residualBits);\n"
*/
- GPU_PRINTF(" printf(\"===== %%d in slot %%d, offset %%d,
targetTypeBits: %%d, approximationBits: %%d (global id: %%d) = %%d\\n\", value,
slot, offset, targetTypeBits, approximationBits, get_global_id(0),
(((offset+approximationBits)>targetTypeBits)*((vals[slot]<<(targetTypeBits-offset))
+ vals[slot+1]>>(approximationBits-targetTypeBits+offset))\n")
- GPU_PRINTF(" +
((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits))));\n")
- " }\n"
+ " )&approximationMask);\n"
+ " value += (delta<<residualBits);"
"\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
+ " size_t outslot =
(index*approximationBits)/targetTypeBits;\n"
+ " size_t outoffset =
(index*approximationBits)%%targetTypeBits;\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"
- " for(int i = 0; i < %4$d; i++){\n"
- " outputTail->values[offset+i] =
approximationTail->values[inputOffset + i];\n"
- " }\n"
- "#endif\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" */
+ /* " for(int i = 0; i < %4$d; i++){\n" */
+ /* " outputTail->values[offset+i] =
approximationTail->values[inputOffset + i];\n" */
+ /* " }\n" */
+ /* "#endif\n" */
+ " if(outoffset+approximationBits > 8*sizeof(accessType))"
+ " outputTail->values[outslot] |= (delta <<
(approximationBits-(8*sizeof(accessType)-outoffset)));"
+ " else"
+ " outputTail->values[outslot] |= (delta <<
(8*sizeof(accessType)-outoffset-approximationBits));"
+ " if(index<10)"
+ " printf(\"%%d: offset+(%%d>>x)=%%d, val[slot=%%u]=%%u,
%%d\\n\", get_global_id(0), delta, value, outslot, outputTail->values[outslot],
(8*sizeof(accessType)-outoffset-approximationBits));"
" }\n"
" }\n"
"}"
};
char* sourceCode = malloc(16384);
- const str typeNames[] = {[TYPE_int] = "int"};
- const size_t typeSizes[] = {[TYPE_int] = sizeof(int)};
- snprintf(sourceCode, 16384,
sourceCodeTemplates[(!!inputIsVoidHeaded)*1], typeNames[type],
(approximationBits ==
8*typeSizes[type])?predicateOperation:(approximateOperation(predicateOperation)),
predicateOperation2?((approximationBits ==
8*typeSizes[type])?predicateOperation2:approximateOperation(predicateOperation2)):"==",
approximationBits/8-offsetBits/8, predicateOperation2 == NULL?1:0,
offsetBits/8);
+ snprintf(sourceCode, 16384,
sourceCodeTemplates[(!!inputIsVoidHeaded)*2], typeNames[type],
(approximationBits ==
8*typeSizes[type])?predicateOperation:(approximateOperation(predicateOperation)),
predicateOperation2?((approximationBits ==
8*typeSizes[type])?predicateOperation2:approximateOperation(predicateOperation2)):"==",
approximationBits/8-offsetBits/8, predicateOperation2 == NULL?1:0,
offsetBits/8);
{
char options[256];
cl_program program;
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
@@ -205,18 +205,30 @@ str BWDLeftJoinApproximate(bat * res, ba
return MAL_SUCCEED;
};
-static inline int decompressIntValue(const int i, const int approximationbits,
const int offsetBits, const clTail* compressedTail, const unsigned char*
residuals, const int residualI){
+static inline int decompressIntValue(const int approximationI, const int
approximationbits, const int offsetBits, const clTail* compressedTail, const
unsigned int* 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 unsigned int residualBytes = residualBits/8; */
const int approximationBytes = approximationbits/8-offsetBits/8;
const int approximationMask = (1<<(approximationBytes*8))-1;
- 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);
+ const int slotI =
(approximationBytes*8)*approximationI/(sizeof(int)*8);
+ const int offset =
((approximationBytes*8)*approximationI)%(sizeof(int)*8);
+ const unsigned int compressedValue = (((unsigned
int*)compressedTail->elements)[slotI] >>
(8*sizeof(int)-offset-(approximationBytes*8))) & approximationMask;
+ const size_t residualSlotI = (residualI*residualBits)/32;
+ const unsigned int residualOffset = (residualI*residualBits)%32;
+ const unsigned int residual = (((unsigned int*)residuals)[residualSlotI]
+
>>
(32-residualOffset-residualBits))&residualMask;
+ const int deCompressedValue = compressedTail->base+
+ (compressedValue << residualBits)
+ + residual;
+
+
+ /* 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;
}
@@ -275,7 +287,7 @@ str BWDLeftJoinRefine(bat * res, bat * l
oid* positionRegion = (oid*) Tloc(left,
BUNfirst(left));
size_t refinementCount = 0;
- const unsigned char* residuals =
batTailResiduals(right);
+ const unsigned int* residuals = (unsigned
int*)batTailResiduals(right);
uint i;
for (i = 0; i < supersetPositionsColumn->count;
++i) {
if(supersetPositionsColumn->positions[i] == *positionRegion){
@@ -389,7 +401,7 @@ static inline str uselect(bat *res, bat
if(err)
printf("#%s,
clEnqueueNDRangeKernel: %s;\n", __func__, clError(err));
if (synchronousGPU)
clFinish(getCommandQueue());
- if(0){
+ if(1){
clTail* compressedTail;
size_t resultSize;
printf ("%s result tail result:
%p\n", __func__, batTailApproximation(result));
@@ -399,6 +411,7 @@ static inline str uselect(bat *res, bat
compressedTail =
malloc(resultSize);
err =
clEnqueueReadBuffer(getCommandQueue(), batTailApproximation(result), CL_TRUE,
0, resultSize, compressedTail , 0, NULL, NULL);
if(err) printf("#%s,
clEnqueueReadBuffer: %s;\n", __func__, clError(err));
+ (void) compressedTail;
}
}
}
@@ -429,11 +442,18 @@ static inline unsigned int refinementLoo
#define refineLoopDoubleOperator(comparator, comparator2,
positionIsTruePositiveCondition, residualPosition) \
while(i < candidateCount) {
\
const unsigned int index = compressedHead->positions[i];
\
- const int offset = tailApproximationBytes*i;
\
- const int compressedValue =
*(int*)&(compressedTail->elements[offset]) & tailApproximationMask; \
+ const int slotI = tailApproximationBytes*8*i/(sizeof(int)*8);
\
+ const int offset =
(tailApproximationBytes*8*i)%(sizeof(int)*8); \
+ const unsigned int compressedValue = (((unsigned
int*)compressedTail->elements)[slotI] >>
(8*sizeof(int)-offset-tailApproximationBytes*8)) & tailApproximationMask; \
+ const size_t residualSlotI = (index*tailResidualBits)/32;
\
+ const unsigned int residualOffset =
(index*tailResidualBits)%32; \
+ const unsigned int residual = (((unsigned
int*)residuals)[residualSlotI] \
+
>>
(32-residualOffset-tailResidualBits))&residualMask; \
const int deCompressedValue = compressedTail->base+
\
(compressedValue << tailResidualBits)
\
- + (*(unsigned
int*)&residuals[residualPosition*residualBytes] & residualMask); \
+ + residual;
\
+ if(i<10) printf ("%u: %d (residual: %d)\n", index,
\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list