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

* still working on grouping
  * grouping should work, let's implement the aggregation part starting with 
sum...


Unterschiede (205 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
@@ -46,7 +46,7 @@ cl_program compileProgram(const char* so
                clGetProgramBuildInfo(program, getDeviceID(), 
CL_PROGRAM_BUILD_LOG, 0, NULL, &bufferSize);
                clGetProgramBuildInfo(program, getDeviceID(), 
CL_PROGRAM_BUILD_LOG, bufferSize, (buffer = GDKmalloc(bufferSize)), NULL);
                printf("#%s, clBuildProgram log: %s;\n", __func__, buffer);
-               free(buffer);
+               GDKfree(buffer);
        }
        /* clock_gettime(CLOCK_THREAD_CPUTIME_ID, &after); */
        /* printf ("compilation took %ld 
nanoseconds\n",(after.tv_sec*1000000000+after.tv_nsec)-(before.tv_sec*1000000000+before.tv_nsec));
 */
@@ -237,34 +237,32 @@ cl_program getUSelectProgram(int type, c
 }
 
 cl_program getGroupProgram(unsigned int approximationBits){
-       char options[256];
        const char* sourceCode = ""
                "#define accessType unsigned int\n"
-               "  __constant static const unsigned int approximationMask = 
((1<<approximationBits)-1);\n"
-               "  __constant static const unsigned int targetTypeBits = 
sizeof(accessType)*8;\n"
+               "__constant static const unsigned int approximationMask = 
((1<<approximationBits)-1);\n"
+               "__constant static const unsigned int targetTypeBits = 
sizeof(accessType)*8;\n"
                "__kernel void group (\n"
                "__global unsigned int* groupIDs,\n"
                "__global unsigned int* histogramOIDs,\n"
                "__global unsigned int* histogramCounts,\n"
                "__global const unsigned int* inputTail\n"
                ") {\n"
-               "    const size_t index = get_global_id(0);\n"
-               " if(index < inputTail[0]){\n"
-               "  const size_t inputIndex = get_global_id(0);"
-               "  size_t slot = 
(inputIndex*approximationBits)/targetTypeBits;\n"
-               "  size_t offset = 
(inputIndex*approximationBits)%targetTypeBits;\n"
-               "  __global const unsigned int* vals = &(inputTail[2]);\n"
-
+               "  const size_t inputIndex = get_global_id(0);\n"
+               "  if(inputIndex < inputTail[0]){\n"
+               "    size_t slot = 
(inputIndex*approximationBits)/targetTypeBits;\n"
+               "    size_t offset = 
(inputIndex*approximationBits)%targetTypeBits;\n"
+               "    __global const unsigned int* vals = &(inputTail[2]);\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)))"
+               "    + 
(((offset+approximationBits)<=targetTypeBits)*(vals[slot]>>(targetTypeBits-offset-approximationBits)))\n"
                "      )&approximationMask);\n"
                "  const uint oldValue = atomic_cmpxchg(histogramOIDs + delta, 
0, inputIndex);\n"
                "  const uint groupID = oldValue?oldValue:inputIndex;\n"
                "  groupIDs[inputIndex] = groupID;\n"
                "  atomic_inc(histogramCounts+groupID);\n"
                " }\n"
-               "}";
+               "}\n";
+       char options[256];
        snprintf(options, 256, "-DapproximationBits=%d", approximationBits);
        return compileProgram(sourceCode, options);
 }
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
@@ -1019,13 +1019,24 @@ str BWDSelectNotNilRefine(int *result, i
 }
 
 
-str BWDGroupedSumApproximate(int *retid,int *bid, int *gid, int *eid){
-       throw(MAL, __func__, "not implemented yet: %s", __func__);
+str BWDGroupedSumApproximate(int *retid,int *valuesID, int *groupsID, int 
*histogramID){
+       throw(MAL, __func__, "not implemented yet: %s (%s:%d)", __func__, 
__FILE__, __LINE__);
 
 }
 
 str BWDGroupedSumRefine(int *retid,int *bid, int *gid, int *eid, bat* approx){
-               throw(MAL, __func__, "not implemented yet: %s", __func__);
+       throw(MAL, __func__, "not implemented yet: %s (%s:%d)", __func__, 
__FILE__, __LINE__);
+
+}
+
+
+str BWDGroupedCountApproximate(int *retid,int *bid, int *gid, int *eid){
+       throw(MAL, __func__, "not implemented yet: %s (%s:%d)", __func__, 
__FILE__, __LINE__);
+
+}
+
+str BWDGroupedCountRefine(int *retid,int *bid, int *gid, int *eid, bat* 
approx){
+       throw(MAL, __func__, "not implemented yet: %s (%s:%d)", __func__, 
__FILE__, __LINE__);
 
 }
 
@@ -1046,11 +1057,35 @@ str bwd_export_value_wrap(Client cntxt, 
 
 /*///////////////////////////// Joins /////////////////////////////*/
 str BWDjoinApproximate(int *ret, int *lid, int *rid ){
-               throw(MAL, __func__, "not implemented yet: %s", __func__);
+       str result;
+       BAT *left = BATdescriptor(*lid), *right = BATdescriptor(*rid);
+
+       if(BAThvoid(left) && BAThvoid(right) && right->tseqbase != oid_nil){
+               result = BWDLeftJoinApproximate(ret, lid, rid);
+
+       } else {
+               throw(MAL, __func__, "not implemented yet: %s (%s:%d)", 
__func__, __FILE__, __LINE__);
+       }
+       BBPreleaseref(left->batCacheid);
+       BBPreleaseref(right->batCacheid);
+       
+       return result;
 }      
 
 str BWDjoinRefine(int *ret, int *lid, int *rid, bat* approx ){
-               throw(MAL, __func__, "not implemented yet: %s", __func__);
+       str result;
+       BAT *left = BATdescriptor(*lid), *right = BATdescriptor(*rid);
+
+       if(BAThvoid(left) && BAThvoid(right) && right->tseqbase != oid_nil){
+               result = BWDLeftJoinRefine(ret, lid, rid, approx);
+
+       } else {
+               throw(MAL, __func__, "not implemented yet: %s (%s:%d)", 
__func__, __FILE__, __LINE__);
+       }
+       BBPreleaseref(left->batCacheid);
+       BBPreleaseref(right->batCacheid);
+       
+       return result;
 }      
 
 
@@ -1115,8 +1150,8 @@ str BWDGroupApproximate(int *rethisto, i
                                        printf("#%s, clEnqueueNDRangeKernel: 
%s;\n", __func__, clError(err));
                                if (synchronousGPU) clFinish(getCommandQueue());
                        }
+                       BBPkeepref(*retbid = groupIDs->batCacheid);
                        BBPkeepref(*rethisto = histo->batCacheid);
-                       BBPkeepref(*retbid = groupIDs->batCacheid);
                }
        }
        BBPreleaseref(b->batCacheid);
@@ -1124,10 +1159,9 @@ str BWDGroupApproximate(int *rethisto, i
 }
 
 str BWDGroupRefine(int *rethisto, int *retbid, int *bid, int *apprrethisto, 
int *apprretbid){
-       *rethisto = *apprrethisto;
-       *retbid = *apprretbid;
-       return MAL_SUCCEED;
-       /* throw(MAL, __func__, "not implemented yet: %s", __func__); */
+       BBPincref(*rethisto = *apprrethisto, 1);
+       BBPincref(*retbid = *apprretbid, 1);
+       throw(MAL, __func__, "not implemented yet: %s", __func__);
 }
 
 str BWDMulticolumnGroupRefine(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci){
diff --git a/monetdb5/extras/bwd/opt_bwd.mal b/monetdb5/extras/bwd/opt_bwd.mal
--- a/monetdb5/extras/bwd/opt_bwd.mal
+++ b/monetdb5/extras/bwd/opt_bwd.mal
@@ -148,6 +148,14 @@ command sumrefine (b:bat[:oid,:int], g:b
 address BWDGroupedSumRefine
 comment "Refines the grouped sum of all tail values.";
 
+command countapproximate (b:bat[:oid,:any_2], 
g:bat[:oid,:oid],e:bat[:oid,:any_1]) :bat[:oid,:int]
+address BWDGroupedCountApproximate
+comment "Approximates the grouped count of all tail values.";
+
+command countrefine (b:bat[:oid,:any_2], g:bat[:oid,:oid],e:bat[:oid,:any_1], 
approximation:bat[:oid,:int]) :bat[:oid,:int]
+address BWDGroupedCountRefine
+comment "Refines the grouped count of all tail values.";
+
 
 pattern 
multicolumnsapproximate(l:bat[:oid,:any]...)(grp:bat[:oid,:any],ext:bat[:oid,:any])
 address BWDMulticolumnGroupApproximate
@@ -158,11 +166,11 @@ address BWDMulticolumnGroupRefine
 comment "Refine a group index over multiple columns. (interface should be more 
like: l:bat[:oid,:any],...,grp:bat[:oid,:any],ext:bat[:oid,:any])";
 
 command doneapproximate(attr:bat[:any_1,:any_2] )
-       (histo:bat[:any_1,:wrd], grp:bat[:any_1,:oid]) 
+       (histo:bat[:any_1,:int], grp:bat[:any_1,:oid]) 
 address BWDGroupApproximate;
 
-command donerefine(attr:bat[:any_1,:any_2], histo:bat[:any_1,:wrd], 
grp:bat[:any_1,:oid])
-       (histo:bat[:any_1,:wrd], grp:bat[:any_1,:oid]) 
+command donerefine(attr:bat[:any_1,:any_2], histo:bat[:any_1,:int], 
grp:bat[:any_1,:oid])
+       (histo:bat[:any_1,:int], grp:bat[:any_1,:oid]) 
 address BWDGroupRefine;
 
 
diff --git a/monetdb5/extras/bwd/optimizer.c b/monetdb5/extras/bwd/optimizer.c
--- a/monetdb5/extras/bwd/optimizer.c
+++ b/monetdb5/extras/bwd/optimizer.c
@@ -86,14 +86,16 @@ static inline int OPTBWDImplementation(C
                         || match_function(oldProgram[i], groupRef, doneRef)
                         || match_function(oldProgram[i], algebraRef, joinRef)
                         || match_function(oldProgram[i], aggrRef, sumRef)
+                        || match_function(oldProgram[i], aggrRef, countRef)
                         || match_function(oldProgram[i], algebraRef, 
leftjoinRef)) {
                ////////////////////////////// rewrite operators 
//////////////////////////////
 
-                       if (getTailType(getDestType(malBlock, oldProgram[i])) 
== TYPE_lng){ //TODO: implement bwd for longs
+                       if (getTailType(getDestType(malBlock, oldProgram[i])) 
== TYPE_lng
+                                       || getTailType(getDestType(malBlock, 
oldProgram[i])) == TYPE_wrd){ //TODO: implement bwd for longs
                                if(isaBatType(getDestType(malBlock, 
oldProgram[i])))
                                        setDestType(malBlock, oldProgram[i], 
newBatType(getHeadType(getDestType(malBlock, oldProgram[i])), TYPE_int));
                                else{
-                                       if(!match_function(oldProgram[i], 
"aggr", "sum")) setDestType(malBlock, oldProgram[i], TYPE_int);
+                                       if(!match_function(oldProgram[i], 
aggrRef, sumRef)) setDestType(malBlock, oldProgram[i], TYPE_int);
                                }
                                        
                                
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to