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

* working on true bitwise (in contrast to bytewise) decomposition


Unterschiede (113 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
@@ -106,7 +106,7 @@ 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"
+               [0] = "__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"
@@ -121,32 +121,23 @@ cl_program getUSelectProgram(int type, c
                "  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"
-               /* "  if(get_global_id(0) < 10)\n" */
-               /* "    printf(\"%%d, i=%%d: value: %%d, chunk: %%d\\n\", 
get_global_id(0), i, value, approximation[inputOffset + i]);\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"
                "  } \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"
+
+               [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"
@@ -159,7 +150,6 @@ cl_program getUSelectProgram(int type, c
                "const %1$s operand2\n"
                ") {\n"
                " if(get_global_id(0) < approximationTail->count){\n"
-               /* " __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"
@@ -185,14 +175,55 @@ cl_program getUSelectProgram(int type, c
                "#endif\n"
                "  }\n"
                " }\n"
+               "}",
+
+                               [2] = "__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 const struct{int count; int base; unsigned char 
values[];}* approximationTail,\n"
+               "const %1$s operand,\n"
+               "const %1$s operand2\n"
+               ") {\n"
+               " if(get_global_id(0) < approximationTail->count){\n"
+               "  static const size_t targetTypeBits = (sizeof(targetType)*8);"
+               "  targetType value  = approximationTail->base;\n"
+               "  size_t slot = 
(get_global_id(0)*approximationBits)/targetTypeBits;"
+               "  size_t offset = 
(get_global_id(0)*approximationBits)%%targetTypeBits;"
+               "  {"
+               "    __global const unsigned char* vals = 
approximationTail->values;"
+               "    value += 
((offset+approximationBits>targetTypeBits)*((vals[slot]<<(targetTypeBits-offset))
 + vals[slot+1]>>(approximationBits-targetTypeBits+offset))\n"
+               "    + 
(offset+approximationBits>targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))&((1<<approximationBits)-1);"
+               "  }"
+               "\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"
                "}"
+
        };
        char* sourceCode = malloc(16384);
        static const str typeNames[] = {[TYPE_int] = "int"};
        static const size_t typeSizes[] = {[TYPE_int] = sizeof(int)};
-       snprintf(sourceCode, 16384, sourceCodeTemplates[inputIsVoidHeaded!=0], 
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);
        {
-               cl_program program = compileProgram(sourceCode,"");
+               char options[64];
+               cl_program program;
+               snprintf(options, 64, "-D targetType=int -D 
approximationBits=%d", approximationBits-offsetBits);
+               printf ("%s\n", sourceCode);
+               program = compileProgram(sourceCode, options);
                free(sourceCode);
                return program;
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to