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

* still working on projections


Unterschiede (162 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
@@ -23,9 +23,35 @@ char* approximateOperation(char* exactOp
 
 static inline void superverboseprintf(const char * format, ... ){};
 
-/* type = BATttype(data) */
-/* predicateOperation  = *OP */
-/* approximationBits = batTailApproximationBits(data) */
+cl_program getProjectionLeftjoinProgram(unsigned int approximationBits){
+                       const char* sourceCodeTemplate = "__kernel void project 
(\n"
+                       "__global struct{int count; int padding; char 
values[];}* outputTail,\n"
+                       "__global struct{int count; int padding; int 
positions[];}* inputTail,"
+                       "__global const char* approximation\n"
+                       ") {\n"
+                       "  const int offset = 
inputTail->positions[get_global_id(0)]*%1$d;\n"
+                       "  for(int i = 0; i < %1$d; i++)\n"
+                       "    outputTail->values[get_global_id(0)*%1$d+i] = 
approximation[offset + i];\n"
+                       "}";
+               char* sourceCode = malloc(16384);
+               snprintf(sourceCode, 16384, sourceCodeTemplate, 
approximationBits/8);
+               superverboseprintf("#%s, sourceCode: %s;\n", __func__, 
sourceCode);
+               cl_int err;
+               cl_program program = clCreateProgramWithSource(getCLContext(), 
1, (const char*[]){sourceCode}, (size_t[]){strlen(sourceCode)}, &err);
+               if(err) THRprintf(GDKout, "#%s, clCreateProgramWithSource: 
%s;\n", __func__, clError(err));
+               err = clBuildProgram(program, 1, (const 
cl_device_id[]){getDeviceID()}, "", NULL, NULL);
+               if(err) {
+                       printf("#%s, clBuildProgram: %s;\n", __func__, 
clError(err));
+                       size_t bufferSize;
+                       char* buffer;
+                       clGetProgramBuildInfo(program, getDeviceID(), 
CL_PROGRAM_BUILD_LOG, 0, NULL, &bufferSize);
+                       clGetProgramBuildInfo(program, getDeviceID(), 
CL_PROGRAM_BUILD_LOG, bufferSize, (buffer = alloca(bufferSize)), NULL);
+                       printf("#%s, clBuildProgram log: %s;\n", __func__, 
buffer);
+               }
+               free(sourceCode);
+               return program;
+}
+
 cl_program getUSelectProgram(int type, char* predicateOperation, unsigned int 
approximationBits){
                        const char* sourceCodeTemplate = "__kernel void uselect 
(\n"
                        "__global struct{int count; int padding; int 
positions[];}* outputHead,"
@@ -38,7 +64,7 @@ cl_program getUSelectProgram(int type, c
                        "  for(int i = 0; i < %3$d; i++)\n"
                        "    value += (approximation[inputOffset + i] << 
((i+sizeof(%1$s) - %3$d)*8));\n"
                        "\n"
-                       "  if(1 || value %2$s operand){\n"
+                       "  if(value %2$s operand){\n"
                        "    const int index = 
atomic_inc(&(outputHead->count));"
                        "    const int offset = index * %3$d;\n"
                        "    outputHead->positions[index] = get_global_id(0);\n"
diff --git a/monetdb5/extras/bwd/cl_program_utilities.h 
b/monetdb5/extras/bwd/cl_program_utilities.h
--- a/monetdb5/extras/bwd/cl_program_utilities.h
+++ b/monetdb5/extras/bwd/cl_program_utilities.h
@@ -9,5 +9,5 @@
 
 
 cl_program getUSelectProgram(int type, char* predicateOperation, unsigned int 
approximationBits);
-
+cl_program getProjectionLeftjoinProgram(unsigned int approximationBits);
 #endif /* _CL_PROGRAM_UTILITIES_H_ */
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
@@ -19,6 +19,20 @@ static const int activateWorkInProgress 
 
 #pragma mark Actual MAL Operations Implementation
 
+
+
+typedef struct {
+       int count;
+       int padding;
+       char elements[];
+} clTail;
+
+typedef struct {
+       int count;
+       int padding;
+       int positions[];
+} clHead;
+
 str BWDLeftJoinApproximate(bat * res, bat * l, bat * r){
 
        ALGODEBUG printf("#BWDfetchjoin: approximating;\n");
@@ -57,14 +71,55 @@ str BWDLeftJoinApproximate(bat * res, ba
                BBPreleaseref(right->batCacheid);
                return MAL_SUCCEED;
        }       else    if(activateWorkInProgress && BAThvoid(left) && 
BAThvoid(right) && right->tseqbase != oid_nil){
-               BAT* result = BATnew(ATOMtype(left->htype), 
ATOMtype(right->ttype), 0);
                cl_mem leftColumn = batTailApproximation(left);
                if(!leftColumn) leftColumn = 
batHeadApproximation(BATmirror(left));
                cl_mem rightColumn = batTailApproximation(right);
                if(!rightColumn) rightColumn = 
batHeadApproximation(BATmirror(right));
+               cl_program program = 
getProjectionLeftjoinProgram(batTailApproximationBits(right));
+
+
+
+               cl_int err;
+               cl_kernel projectKernel = clCreateKernel(program, "project", 
&err);
+               if(err) THRprintf(GDKout, "#%s, clCreateKernel: %s;\n", 
__func__, clError(err));
+
+
+               int headCount; // :-)
+               {
+                       cl_int err = clEnqueueReadBuffer(getCommandQueue(), 
leftColumn, CL_TRUE, 0, sizeof(int), &headCount , 0, NULL, NULL);   
+                       if(err) THRprintf(GDKout, "#%s, clEnqueueReadBuffer: 
%s;\n", __func__, clError(err));
+               }
+
+               BAT* result = BATnew(TYPE_void, ATOMtype(right->ttype), 0);
+               {
+                       const unsigned int newIndex = 
getNextFreeDecomposedBATSlotIndex();
+                       DecomposedBATSlot* slot = 
getDecomposedBATSlot(newIndex);
+                       BATsetprop(result, batRegistryIndex, TYPE_int, 
(int[]){newIndex});
+                       slot->approximationBits = 
batTailApproximationBits(right);
+                       slot->residuals = NULL;
+                       cl_int err;
+                       slot->tailApproximation = 
clCreateBuffer(getCLContext(), CL_MEM_READ_WRITE, 
headCount*slot->approximationBits/8+sizeof(clTail), NULL, &err);
+
+                       clEnqueueWriteBuffer(getCommandQueue(), 
slot->tailApproximation, CL_TRUE, 0, sizeof(int), &headCount, 0, NULL, NULL); 
// I wonder what is faster transfering a single integer to the GPU or running a 
kernel that initializes a value
+                       if(err) printf("#%s, clCreateBuffer: %s;\n", __func__, 
clError(err));
+
+               }
+
+               for (int i = 0; i < 3; ++i) {
+                       if((err = clSetKernelArg(projectKernel, i, 
sizeof(cl_mem), &((cl_mem[]){
+                                                               
batTailApproximation(result), leftColumn, rightColumn}[i]
+                                                       )))) THRprintf(GDKout, 
"#%s, clSetKernelArg(%d): %s;\n", __func__, 0, clError(err));
+               }
+
+
+
+
+
+               if((err = clEnqueueNDRangeKernel(getCommandQueue(), 
projectKernel, 1, (const size_t[]){0}, (const size_t[]){headCount}, (const 
size_t[]){1}, 0, NULL, NULL)))
+                       THRprintf(GDKout, "#%s, clEnqueueNDRangeKernel: %s;\n", 
__func__, clError(err));
+
 
                
-               throw (MAL, "unimplemented", "%s (BAThvoid(left) && 
BAThvoid(right) && right->tseqbase != oid_nil), leftColumn: %p", __func__, 
leftColumn);             
        } else
                printf("bwd.BWDLeftJoinApproximate, %s (BAThvoid(left): %d, 
BATtvoid(left): %d, BAThvoid(right): %d, right->tseqbase: %ld)", "this case 
isn't implemented yet", BAThvoid(left), BATtvoid(left), BATtvoid(right), 
left->tseqbase);
        return MAL_SUCCEED;
@@ -111,18 +166,6 @@ static inline size_t clDeviceAddressByte
        return CL_DEVICE_ADDRESS_BYTES;                         //TODO: check 
that CL_DEVICE_ADDRESS_BITS 
 }
 
-typedef struct {
-       int count;
-       int padding;
-       char elements[];
-} clTail;
-
-typedef struct {
-       int count;
-       int padding;
-       int positions[];
-} clHead;
-
 
 static inline void superverboseprintf(const char * format, ... ){};
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to