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

* doing real BITwise decomposition now but not necessarily appropriate 
processing :-|


Unterschiede (184 Zeilen):

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
@@ -333,101 +333,101 @@ char* humanreadablesize(unsigned int val
 }
 
 
-unsigned int decomposeIntArray(const int* subject, const size_t size, const 
size_t approximationBits){
-       if (approximationBits % 8 > 0 || approximationBits <= 0) {
-               printf("#decomposeTail: number of bits for approximation has to 
be a multiple of 8, is %ld;\n", approximationBits);
-               return -1;
-       } else {
-               const bounds subjectBounds = findBounds(subject,size);
-               const int neededBits = ceil(log2(subjectBounds.max - 
subjectBounds.min));
-               const unsigned int newIndex = 
getNextFreeDecomposedBATSlotIndex();
-               DecomposedBATSlot* slot = 
getDecomposedBATSlotForIndex(newIndex);
-               const unsigned int residualBytes = (32-approximationBits)/8;
-               const unsigned int approximationBytes = 
approximationBits/8-(32-ceil(neededBits/8.0)*8)/8;
-               const unsigned int residualBits = 32-approximationBits;
-               const unsigned int residualMask = (1 << residualBits)-1;
-               clTail* approximation = calloc((size+1)*approximationBytes+ 
sizeof(clTail), sizeof(char));
-               unsigned int i;
-               static cl_program program = NULL;
-               cl_int err;
+unsigned int decomposeIntArray(const int* subject, const size_t size, const 
size_t baseBitsPlusApproximationBits){
+       const bounds subjectBounds = findBounds(subject,size);
+       const int neededBits = ceil(log2(subjectBounds.max - 
subjectBounds.min));
+       const unsigned int newIndex = getNextFreeDecomposedBATSlotIndex();
+       DecomposedBATSlot* slot = getDecomposedBATSlotForIndex(newIndex);
+       const unsigned int residualBits = 32-baseBitsPlusApproximationBits;
+       const unsigned int residualMask = (1 << residualBits)-1;
+       const unsigned int approximationBits = neededBits-residualBits;
+       const size_t approximationSize = ceil(size*approximationBits/8.0) + 
sizeof(long) + sizeof(clTail);
+       clTail* approximation = calloc(approximationSize, sizeof(char));
+       unsigned int i;
+       static cl_program program = NULL;
+       cl_int err;
 
                
        
 
-       slot->tailOffsetBits = 32-ceil(neededBits/8.0)*8;
+       slot->tailOffsetBits = 32-neededBits;
        slot->approximationBits = approximationBits;
        slot->isPersistentBAT = 1;
-       printf ("bounds: %d, %d, offset %zd bytes\n",subjectBounds.min, 
subjectBounds.max, slot->tailOffsetBits/8);
+       printf ("bounds: %d, %d, offset %zd bits\n",subjectBounds.min, 
subjectBounds.max, slot->tailOffsetBits);
                
                
        
-               printf ("using %s for approximation and %s for residuals \n", 
humanreadablesize(approximationBytes*(size+1)+ sizeof(clTail), alloca(64), 64), 
humanreadablesize(residualBytes*(size+1), alloca(64), 64));
-               slot->residuals = calloc((size+1)*residualBytes, sizeof(char));
-               approximation->base = subjectBounds.min;
-               slot->tailOffsetValue = approximation->base;
-               approximation->count = size;
+       printf ("using %s for approximation and %s for residuals \n", 
humanreadablesize(approximationSize, alloca(64), 64), 
humanreadablesize(ceil(size*residualBits/8.0) + 8, alloca(64), 64));
+       slot->residuals = calloc(ceil(size*residualBits/8.0) + 8, sizeof(char));
+       approximation->base = subjectBounds.min;
+       slot->tailOffsetValue = approximation->base;
+       approximation->count = size;
        
-               for (i = 0; i < size; ++i) {
-                       { // approximation
-                               const size_t slotI = 
(i*(approximationBytes*8))/32;
-                               const unsigned int offset = 
(i*(approximationBytes*8))%32;
-                               if(offset+(approximationBytes*8) > 32) {
-                                       ((unsigned 
int*)approximation->elements)[slotI] |= (((subject[i]-approximation->base) >> 
residualBits)>>((approximationBytes*8)-(32-offset)));
-                                       ((unsigned 
int*)approximation->elements)[slotI+1] |= (((subject[i]-approximation->base) >> 
residualBits)<<(32-((approximationBytes*8)-(32-offset))));
-                               } else {
-                                       ((unsigned 
int*)approximation->elements)[slotI] |= (((subject[i]-approximation->base) >> 
residualBits)<<(32-offset-(approximationBytes*8)));
-                               }
-                       }
-                       { // residual
-                               const size_t slotI = (i*residualBits)/32;
-                               const unsigned int offset = (i*residualBits)%32;
-                               ((unsigned int*)slot->residuals)[slotI] |= 
(((subject[i]-approximation->base)&residualMask)<<(32-offset-residualBits));
+       for (i = 0; i < size; ++i) {
+               { // approximation
+                       const size_t slotI = (i*approximationBits)/32;
+                       const unsigned int offset = (i*approximationBits)%32;
+                       if(offset+approximationBits > 32) {
+                               ((unsigned int*)approximation->elements)[slotI] 
|= (((subject[i]-approximation->base) >> 
residualBits)>>(approximationBits-(32-offset)));
+                               ((unsigned 
int*)approximation->elements)[slotI+1] |= (((subject[i]-approximation->base) >> 
residualBits)<<(32-(approximationBits-(32-offset))));
+                       } else {
+                               ((unsigned int*)approximation->elements)[slotI] 
|= (((subject[i]-approximation->base) >> 
residualBits)<<(32-offset-approximationBits));
                        }
                }
+               { // residual
+                       const size_t slotI = (i*residualBits)/32;
+                       const unsigned int offset = (i*residualBits)%32;
+                       if(offset+residualBits < 32) {
+                               ((unsigned int*)slot->residuals)[slotI] |= 
(((subject[i]-approximation->base)&residualMask)<<(32-offset-residualBits));
+                       } else {
+                               ((unsigned int*)slot->residuals)[slotI] |= 
(((subject[i]-approximation->base)&residualMask)>>(residualBits-(32-offset)));
+                               ((unsigned int*)slot->residuals)[slotI+1] |= 
(((subject[i]-approximation->base)&residualMask)<<(32-(residualBits-(32-offset))));
+                       }
+               }
+       }
 
-               {               
-                       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");
+       {               
+               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));
+                       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));
+
+
+
+               {
+                       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, 
approximationSize, 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);
+                       
                        }
-
-                       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));
-
-                                       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;
        }
+       free(approximation);
+       return newIndex;
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to