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

* switched from generating selection kernel c-code myself to using compiler 
definitions


Unterschiede (124 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
@@ -114,49 +114,44 @@ cl_program getProjectionLeftjoinProgram(
 }
 
 cl_program getUSelectProgram(int type, char* predicateOperation, char* 
predicateOperation2, unsigned int approximationBits, unsigned int offsetBits, 
char inputIsVoidHeaded){
-
        const char* sourceCodeTemplates[] = {
-               [0] = "  __constant static const size_t targetTypeBits = 
(sizeof(targetType)*8);\n"
+               [0] = "#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" // 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"
-               "__global const struct{int count; int padding; int 
positions[];}* approximationHead\n"
-               ",\n"
-               "const %1$s operand,\n"
-               "const %1$s operand2\n"
+               "__global const struct{int count; int padding; int 
positions[];}* approximationHead,\n"
+               "const targetType operand,\n"
+               "const targetType 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"
+               "  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"
-               
+               "  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"
-
-               
-               "  if((value %2$s operand)"
-               "     && (%5$d || value %3$s operand2)"
-               "    )"
-               "{\n"
+               "  if((value firstOperator operand)"
+               "     && (secondOperatorUnset || value secondOperator operand2)"
+               "    ){\n"
                "    const int index = atomic_inc(&(outputHead->count));\n"
                "    atomic_inc(&(outputTail->count));\n" // TODO: this could 
probably be done more efficiently
-               "    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"
+               "    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));"
                "    }\n"
                "  } \n"
-               " }\n"
-               "}",
-
+               " }\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"
@@ -164,26 +159,26 @@ cl_program getUSelectProgram(int type, c
                "__global struct{int count; int padding; int positions[];}* 
outputHead,\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"
+               "const targetType operand,\n"
+               "const targetType operand2\n"
                ") {\n"
                " if(get_global_id(0) < approximationTail->count){\n"
                "  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"
+               "  size_t offset = 
(get_global_id(0)*approximationBits)%targetTypeBits;\n"
                "    __global const unsigned int* vals = 
approximationTail->values;\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"
-               "  if((value %2$s operand)"
-               "     && (%5$d || value %3$s operand2)"
+               "  if((value firstOperator operand)"
+               "     && (secondOperatorUnset || value secondOperator 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"
+               "    size_t outoffset = 
(index*approximationBits)%targetTypeBits;\n"
                "    outputHead->positions[index] = get_global_id(0);\n"
                "    if(outoffset+approximationBits > 8*sizeof(accessType))"
                "      outputTail->values[outslot] |= (delta << 
(approximationBits-(8*sizeof(accessType)-outoffset)));"
@@ -194,15 +189,15 @@ cl_program getUSelectProgram(int type, c
                "}"
 
        };
-       char* sourceCode = malloc(16384);
-       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* sourceCode = malloc(16384); */
+       /* 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;
-               snprintf(options, 256, "-D targetType=int -D 
approximationBits=%d -D residualBits=%lu", approximationBits, 
typeSizes[type]*8-offsetBits-approximationBits);
+               snprintf(options, 256, "-DtargetType=%s -DapproximationBits=%d 
-DresidualBits=%lu -DfirstOperator=%s -DsecondOperator=%s 
-DsecondOperatorUnset=%d", typeNames[type], approximationBits, 
typeSizes[type]*8-offsetBits-approximationBits, (approximationBits == 
8*typeSizes[type])?predicateOperation:(approximateOperation(predicateOperation)),
 predicateOperation2?((approximationBits == 
8*typeSizes[type])?predicateOperation2:approximateOperation(predicateOperation2)):"==",
 predicateOperation2 == NULL?1:0);
                /* printf ("%s\n", sourceCode); */
-               program = compileProgram(sourceCode, options);
-               free(sourceCode);
+               program = 
compileProgram(sourceCodeTemplates[!!inputIsVoidHeaded], options);
+               /* free(sourceCode); */
                return program;
        }
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to