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

* true bitwise approximation of selections seems to work, let's get to the 
refinement


Unterschiede (174 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
@@ -66,7 +66,6 @@ cl_program getMultiplyProgram(unsigned i
                "    outputTail->values[get_global_id(0)*approximationBytes+i] 
= approximation[offset + i];\n"
                "    value += approximation[offset + i] << 8*i;"
                "  }\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);
@@ -79,7 +78,6 @@ cl_program getProjectionLeftjoinProgram(
        if(programCache[deviceForThisThread][approximationBits/8-offsetBits/8] 
== NULL){
                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"
@@ -92,24 +90,24 @@ cl_program getProjectionLeftjoinProgram(
                        "  size_t slot = 
(inputIndex*approximationBits)/targetTypeBits;\n"
                        "  size_t offset = 
(inputIndex*approximationBits)%targetTypeBits;\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"
-                       "    + 
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
-                       "      )&approximationMask);\n"
+
+               "    const unsigned int delta = (("
+               "      
(((offset+approximationBits)>targetTypeBits)?(((vals[slot]<<(approximationBits-targetTypeBits+offset))
 + 
(vals[slot+1]>>(targetTypeBits-(approximationBits-targetTypeBits+offset))))&approximationMask):0)\n"
+               "    + 
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
+               "      )&approximationMask);\n"
                        "    size_t outslot = 
(index*approximationBits)/targetTypeBits;\n"
                        "    size_t outoffset = 
(index*approximationBits)%targetTypeBits;\n"
-                       "    if(outoffset+approximationBits > 
8*sizeof(accessType))"
-                       "      atomic_add(&(outputTail->values[outslot]), 
(delta << (approximationBits-(8*sizeof(accessType)-outoffset))));"
-                       "    else"
-                       "      atomic_add(&(outputTail->values[outslot]), 
(delta << (8*sizeof(accessType)-outoffset-approximationBits)));"
-                       "    int value = 
approximationTail->base+(delta<<residualBits);"
-                       "    if(index==2114)"
-                       "      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));"
+                       "    if(outoffset+approximationBits > targetTypeBits){"
+                       "      atomic_add(&(outputTail->values[outslot]), 
(delta >> (outoffset+approximationBits-targetTypeBits)));"
+                       "      atomic_add(&(outputTail->values[outslot+1]), 
(delta << (targetTypeBits-(outoffset+approximationBits-targetTypeBits))));"
+                       "    }else{"
+                       "      atomic_add(&(outputTail->values[outslot]), 
(delta << (targetTypeBits-outoffset-approximationBits)));"
+                       "    }"
                        " }\n"
                        "}";
                char options[256];
                int type = TYPE_int;
-               snprintf(options, 256, "-D approximationBytes=%d -D 
residualBits=%lu", approximationBits/8-offsetBits/8, 
typeSizes[type]*8-approximationBits);
+               snprintf(options, 256, "-D approximationBits=%d -D 
residualBits=%lu", approximationBits, 
typeSizes[type]*8-approximationBits-offsetBits);
                
programCache[deviceForThisThread][approximationBits/8-offsetBits/8] = 
compileProgram(sourceCode, options);
        }
        return 
programCache[deviceForThisThread][approximationBits/8-offsetBits/8]; 
@@ -134,17 +132,15 @@ cl_program getUSelectProgram(int type, c
                " __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" */
                "  size_t slot = 
(get_global_id(0)*approximationBits)/targetTypeBits;\n"
                "  size_t offset = 
(get_global_id(0)*approximationBits)%%targetTypeBits;\n"
                
+               "    const unsigned int delta = (("
+               "      
(((offset+approximationBits)>targetTypeBits)?(((vals[slot]<<(approximationBits-targetTypeBits+offset))
 + 
(vals[slot+1]>>(targetTypeBits-(approximationBits-targetTypeBits+offset))))&approximationMask):0)\n"
+               "    + 
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
+               "      )&approximationMask);\n"
+               "    value += (delta<<residualBits);\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)"
@@ -161,48 +157,7 @@ cl_program getUSelectProgram(int type, c
                " }\n"
                "}",
 
-               [1] = "__kernel void uselect (\n" // void-headed case
-               "__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"
-               "#endif\n"
-               "const %1$s operand,\n"
-               "const %1$s operand2\n"
-               ") {\n"
-               " if(get_global_id(0) < approximationTail->count){\n"
-               "  %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 += (approximationTail->values[inputOffset + i] << 
((i+sizeof(%1$s)-%6$d - %4$d)*8));\n"
-               "#endif\n"
-               GPU_PRINTF("  printf(\"===== %%d (global id: %%d)\\n\", value, 
get_global_id(0));")
-               "\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
-               "    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"
-               "  }\n"
-               " }\n"
-               "}",
-
-               [2] = "#define accessType unsigned int\n"
+               [1] = "#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
@@ -217,12 +172,11 @@ cl_program getUSelectProgram(int type, c
                "  size_t slot = 
(get_global_id(0)*approximationBits)/targetTypeBits;\n"
                "  size_t offset = 
(get_global_id(0)*approximationBits)%%targetTypeBits;\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"
+               "    const unsigned int delta = (("
+               "      
(((offset+approximationBits)>targetTypeBits)?(((vals[slot]<<(approximationBits-targetTypeBits+offset))
 + 
(vals[slot+1]>>(targetTypeBits-(approximationBits-targetTypeBits+offset))))&approximationMask):0)\n"
                "    + 
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))"
                "      )&approximationMask);\n"
-               "    value += (delta<<residualBits);"
-               "\n"
+               "    value += (delta<<residualBits);\n"
                "  if((value %2$s operand)"
                "     && (%5$d || value %3$s operand2)"
                "    ){\n"
@@ -231,27 +185,17 @@ cl_program getUSelectProgram(int type, c
                "    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(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);
-       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);
+       snprintf(sourceCode, 16384, sourceCodeTemplates[!!inputIsVoidHeaded], 
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;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to