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

* bitwise selection seems to work for bytewise decompositions now


Unterschiede (199 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
@@ -158,6 +158,7 @@ cl_program getUSelectProgram(int type, c
                "  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"
+               "  printf(\"===== %%d (global id: %%d)\\n\", value, 
get_global_id(0));"
                "\n"
                "  if((value %2$s operand)"
                "     && (%5$d || value %3$s operand2)"
@@ -177,7 +178,8 @@ cl_program getUSelectProgram(int type, c
                " }\n"
                "}",
 
-                               [2] = "__kernel void uselect (\n" // 
void-headed case
+                       [2] = "  __constant static const size_t targetTypeBits 
= (sizeof(targetType)*8);"
+                       "__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"
@@ -185,15 +187,16 @@ cl_program getUSelectProgram(int type, c
                "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);"
-               "  }"
+               "  size_t slot = 
(get_global_id(0)*approximationBits)/targetTypeBits;\n"
+               "  size_t offset = 
(get_global_id(0)*approximationBits)%%targetTypeBits;\n"
+               "  {\n"
+               "    __global const unsigned char* vals = 
approximationTail->values;\n"
+               "    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))<<residualBits);\n"
+               "    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"
+               "    + 
((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits))));\n"
+               "  }\n"
                "\n"
                "  if((value %2$s operand)"
                "     && (%5$d || value %3$s operand2)"
@@ -215,14 +218,14 @@ cl_program getUSelectProgram(int type, c
 
        };
        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], 
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);
+       const str typeNames[] = {[TYPE_int] = "int"};
+       const size_t typeSizes[] = {[TYPE_int] = sizeof(int)};
+       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[64];
+               char options[256];
                cl_program program;
-               snprintf(options, 64, "-D targetType=int -D 
approximationBits=%d", approximationBits-offsetBits);
-               printf ("%s\n", sourceCode);
+               snprintf(options, 256, "-D targetType=int -D 
approximationBits=%d -D residualBits=%lu", approximationBits-offsetBits, 
typeSizes[type]*8-approximationBits-offsetBits);
+               /* printf ("%s\n", sourceCode); */
                program = compileProgram(sourceCode, options);
                free(sourceCode);
                return 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
@@ -376,11 +376,11 @@ static inline str uselect(bat *res, bat 
                        
                                {
                                        int base = batTailOffsetValue(data);
+                                       int i;
                                        const int parameters[2] = {
                                                
(((((*(int*)val)-base)>>batTailResidualBits(data))<<batTailResidualBits(data)) 
+ base),
                                                
val2?(((((*(int*)val2)-base)>>batTailResidualBits(data))<<batTailResidualBits(data))
 + base):0};
                                        printf ("relaxed conditions from (%d, 
%d) to (%d, %d)\n", *(int*)val, val2?(*(int*)val2):-1, parameters[0], 
parameters[1]);
-                                       int i;
                                        for (i = 0; i < 2; ++i) 
                                                if((err = 
clSetKernelArg(selectKernel, bufferI+i, sizeof(int), &(parameters[i]))))  // 
type specific
                                                        printf("#%s, 
clSetKernelArg(%d): %s;\n", __func__, bufferI+i, clError(err));
diff --git a/monetdb5/extras/bwd/utilities.c b/monetdb5/extras/bwd/utilities.c
--- a/monetdb5/extras/bwd/utilities.c
+++ b/monetdb5/extras/bwd/utilities.c
@@ -160,9 +160,9 @@ cl_context getCLContext(void){
                cl_uint numberOfDevices;
                cl_platform_id platforms[4];
                cl_uint foundPlatforms;
+               cl_int err;
                if(clGetPlatformIDs(4,platforms,&foundPlatforms) != CL_SUCCESS) 
printf("problem when finding the platforms");
                if (!foundPlatforms) printf("didn't find any OpenCL Platforms");
-               cl_int err;
                if ((err = clGetDeviceIDs(*platforms,CL_DEVICE_TYPE_ALL, 4, 
devices, &numberOfDevices)) != CL_SUCCESS)  printf("error getting GPU device 
id: %s\n", clError(err));
                clContextSingleton = clCreateContext(0,numberOfDevices, 
devices, NULL, NULL, &err);
                initialized = 1;
@@ -202,14 +202,16 @@ const char* batRegistryIndex = "bwd.batR
        return BATgetprop(subject, batRegistryIndex) != NULL;
 }
 
- cl_mem batTailApproximation(const BAT* subject){
-               PROPrec* rightTailApproximationProperty;
-               if(!(rightTailApproximationProperty = BATgetprop(subject, 
batRegistryIndex))){
-                       if(0) printf("%s: bat hasn't been decomposed;\n", 
__func__);
-                       return NULL;
-               }
+cl_mem batTailApproximation(const BAT* subject){
+       PROPrec* rightTailApproximationProperty;
+       if(!(rightTailApproximationProperty = BATgetprop(subject, 
batRegistryIndex))){
+               if(0) printf("%s: bat hasn't been decomposed;\n", __func__);
+               return NULL;
+       }
+       {
                DecomposedBATSlot* slot = getDecomposedBATSlot(subject);
                return 
slot->isPersistentBAT?slot->tailApproximations[getGPUDeviceForThisThread()]:slot->tailApproximation;
+       }
 }
 
 
@@ -370,44 +372,48 @@ unsigned int decomposeIntArray(const int
                        *((unsigned 
int*)(&approximation->elements[i*approximationBytes])) |= 
((subject[i]-approximation->base) >> residualBits);
                }
 
+               {               
+                       cl_uint numberOfDevices;
+                       cl_device_id devices[4] = {};
+                       const cl_context context = getCLContext();
+                       const char* sourceCode = "__kernel void dummy (__global 
const struct{int count; int padding; char values[];}* inputTail1){}";
+                       {
+                               cl_platform_id platforms[4];
+                               cl_uint foundPlatforms;
+                               
if(clGetPlatformIDs(4,platforms,&foundPlatforms) != CL_SUCCESS) printf("problem 
when finding the platforms");
+                               if (!foundPlatforms) printf("didn't find any 
OpenCL Platforms");
+               
+ 
+                               if ((err = 
clGetDeviceIDs(*platforms,CL_DEVICE_TYPE_ALL, 4, devices, &numberOfDevices)) != 
CL_SUCCESS)  printf("error getting GPU device id: %s\n", clError(err));
+                       }
 
-               cl_platform_id platforms[4];
-               cl_uint foundPlatforms;
-               if(clGetPlatformIDs(4,platforms,&foundPlatforms) != CL_SUCCESS) 
printf("problem when finding the platforms");
-               if (!foundPlatforms) printf("didn't find any OpenCL Platforms");
-               
-               cl_uint numberOfDevices;
-               cl_device_id devices[4] = {};
- 
-               if ((err = clGetDeviceIDs(*platforms,CL_DEVICE_TYPE_ALL, 4, 
devices, &numberOfDevices)) != CL_SUCCESS)  printf("error getting GPU device 
id: %s\n", clError(err));
+                       program = clCreateProgramWithSource(context, 1, (const 
char*[]){sourceCode}, (size_t[]){strlen(sourceCode)}, &err);
+                       if(err) printf("#%s, clCreateProgramWithSource: %s;\n", 
__func__, clError(err));
+                       err = clBuildProgram(program, numberOfDevices, devices, 
"", NULL, NULL);
+                       if(err) printf("#%s, clBuildProgram: %s;\n", __func__, 
clError(err));
 
-               const cl_context context = getCLContext();
 
-               char* sourceCode = "__kernel void dummy (__global const 
struct{int count; int padding; char values[];}* inputTail1){}";
-               program = clCreateProgramWithSource(context, 1, (const 
char*[]){sourceCode}, (size_t[]){strlen(sourceCode)}, &err);
-               if(err) printf("#%s, clCreateProgramWithSource: %s;\n", 
__func__, clError(err));
-               err = clBuildProgram(program, numberOfDevices, devices, "", 
NULL, NULL);
-               if(err) printf("#%s, clBuildProgram: %s;\n", __func__, 
clError(err));
 
+                       {
+                               uint device;
+                               for (device = 0; device < numberOfDevices; 
++device) {
+                                       cl_command_queue queue = 
clCreateCommandQueue(context,devices[device],0,&err);
+                                       cl_kernel dummyKernel = 
clCreateKernel(program, "dummy", &err);
 
+                                       slot->tailApproximations[device] = 
bwdClCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, 
size*approximationBytes+sizeof(size_t)+sizeof(clTail), approximation, &err);
+                                       if(err) printf("#%s, clCreateBuffer: 
%s;\n", __func__, clError(err));
 
-               uint device;
-               for (device = 0; device < numberOfDevices; ++device) {
-                       cl_command_queue queue = 
clCreateCommandQueue(context,devices[device],0,&err);
-                       cl_kernel dummyKernel = clCreateKernel(program, 
"dummy", &err);
-
-                       slot->tailApproximations[device] = 
bwdClCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, 
size*approximationBytes+sizeof(size_t)+sizeof(clTail), approximation, &err);
-                       if(err) printf("#%s, clCreateBuffer: %s;\n", __func__, 
clError(err));
-
-                       if(err) printf("#%s, clCreateKernel: %s;\n", __func__, 
clError(err));
-                       err = clSetKernelArg(dummyKernel, 0, sizeof(cl_mem), 
(cl_mem[]){slot->tailApproximations[device]});
-                       if(err) printf("#%s, clSetKernelArg: %s;\n", __func__, 
clError(err));
-                       if((err = clEnqueueNDRangeKernel(queue, dummyKernel, 1, 
(const size_t[]){0}, (const size_t[]){1}, (const size_t[]){1}, 0, NULL, NULL)))
-                               printf("#%s, clEnqueueNDRangeKernel: %s;\n", 
__func__, clError(err));
-                       clFinish(queue);
+                                       if(err) printf("#%s, clCreateKernel: 
%s;\n", __func__, clError(err));
+                                       err = clSetKernelArg(dummyKernel, 0, 
sizeof(cl_mem), (cl_mem[]){slot->tailApproximations[device]});
+                                       if(err) printf("#%s, clSetKernelArg: 
%s;\n", __func__, clError(err));
+                                       if((err = clEnqueueNDRangeKernel(queue, 
dummyKernel, 1, (const size_t[]){0}, (const size_t[]){1}, (const size_t[]){1}, 
0, NULL, NULL)))
+                                               printf("#%s, 
clEnqueueNDRangeKernel: %s;\n", __func__, clError(err));
+                                       clFinish(queue);
+                       
+                               }
+                       }
                        
                }
-
                free(approximation);
                return newIndex;
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to