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