Changeset: afbf998b23f2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afbf998b23f2
Modified Files:
monetdb5/extras/bwd/operations.c
monetdb5/extras/bwd/optimizer.c
Branch: bwd
Log Message:
* using a translucent join for grouping refinement now (instead of an explicit
left join)
Unterschiede (108 Zeilen):
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
@@ -1571,7 +1571,7 @@ str BWDMulticolumnGroupApproximate(Clien
result = NOT_DECOMPOSED;
}
assert(batTailResidualBits(inputs[i]) == 0); // we don't yet do
A&R grouping, thus we need all data on the GPU
-
+ assert(batTailPositions(inputs[i]) ==
batTailPositions(inputs[0])); //make sure inputs are projected from the same
selection
}
if(result == MAL_SUCCEED){ // get input objects and parameters
@@ -1597,6 +1597,8 @@ str BWDMulticolumnGroupApproximate(Clien
groupIDSlot->approximationBits = sizeof(int)*8;
groupIDSlot->tailOffsetBits = sizeof(int)*8;
+
+ groupIDSlot->tailPositions =
batTailPositions(inputs[0]);
groupIDSlot->tailApproximation =
bwdClCreateBuffer(getCLContext(), CL_MEM_READ_WRITE,
sizeof(int)*newTailDefinition.count+sizeof(clHead), NULL, &err);
err = clEnqueueWriteBuffer(getCommandQueue(),
groupIDSlot->tailApproximation, CL_TRUE, 0, sizeof(clTail), &newTailDefinition,
0, NULL, NULL);
if(err) printf("#%s, clEnqueueWriteBuffer:
%s;\n", __func__, clError(err));
@@ -1802,23 +1804,59 @@ str BWDMulticolumnGroupRefine(Client cnt
int i;
BAT **inputs = (BAT**) GDKzalloc(sizeof(BAT*) * pci->argc);
- for (i = 0; i < pci->argc-4; ++i){
+ for (i = 0; i < pci->argc-5; ++i){
inputs[i] = BATdescriptor(*(int*) getArgReference(stk,pci,i+2));
if (inputs[i] == NULL)
throw(MAL, __func__, RUNTIME_OBJECT_MISSING);
}
{
- BAT *approximationrethisto = BATdescriptor(*(int*)
getArgReference(stk,pci, pci->argc-2));
- BAT *approximationretbid = BATdescriptor(*(int*)
getArgReference(stk,pci,pci->argc-1));
+ BAT *approximationrethisto = BATdescriptor(*(int*)
getArgReference(stk,pci, pci->argc-3));
+ BAT *approximationretbid = BATdescriptor(*(int*)
getArgReference(stk,pci,pci->argc-2));
+ BAT *refinedOIDs = BATdescriptor(*(int*)
getArgReference(stk,pci,pci->argc-1));
/* BBPincref(*retbid =
materializeBATInHostMemory(approximationretbid)->batCacheid, 1); */
/* BBPincref(*rethisto =
materializeBATInHostMemory(approximationrethisto)->batCacheid, 1); */
- BBPkeepref(*retbid =
materializeBATInHostMemory(approximationretbid)->batCacheid);
+ assert(batTailResidualBits(approximationretbid) == 0);
+ {
+ unsigned int count =
getCount(batTailApproximation(approximationretbid));
+ BAT* result = BATnew(BAThtype(approximationretbid),
BATttype(approximationretbid), count);
+ clHead* positionsColumn;
+ size_t bufferSize;
+
getPositionsColumn(batTailPositions(approximationretbid), NULL, &bufferSize);
+ positionsColumn =
getPositionsColumn(batTailPositions(approximationretbid),
GDKmalloc(bufferSize), &bufferSize);
+ assert(count == positionsColumn->count);
+ BATseqbase(result, 0);
+ {
+ register oid* outputRegion = (oid*)
Tloc(result, BUNfirst(result));
+ unsigned int i, outI, refinedPositionsI;
+
+ clTail* valueColumn;
+ size_t bufferSize;
+
getApproximateValuesColumn(batTailApproximation(approximationretbid), NULL,
&bufferSize);
+ valueColumn =
getApproximateValuesColumn(batTailApproximation(approximationretbid),
GDKmalloc(bufferSize), &bufferSize);
+ assert(count == valueColumn->count);
+ for (i = outI = refinedPositionsI = 0; i <
count; i++) {
+ outputRegion[outI] = ((unsigned
int*)valueColumn->elements)[i];
+ outI += (positionsColumn->positions[i]
== ((oid*)refinedOIDs->T->heap.base)[refinedPositionsI]);
+ refinedPositionsI +=
(positionsColumn->positions[i] ==
((oid*)refinedOIDs->T->heap.base)[refinedPositionsI]);
+ }
+ count = outI;
+
+ }
+ BATsetcount(result, count);
+ if(BAThtype(result) != TYPE_void)
+ result->hsorted = FALSE;
+ if(BATttype(result) != TYPE_void)
+ result->tsorted = FALSE;
+ BBPkeepref(*retbid = result->batCacheid);
+ }
+
BBPkeepref(*rethisto =
materializeBATInHostMemory(approximationrethisto)->batCacheid);
BBPreleaseref(approximationrethisto->batCacheid);
BBPreleaseref(approximationretbid->batCacheid);
+ BBPreleaseref(refinedOIDs->batCacheid);
}
- for (i = 0; i< pci->argc-4; ++i)
+ for (i = 0; i< pci->argc-5; ++i)
BBPreleaseref(inputs[i]->batCacheid);
return result;
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
@@ -139,16 +139,11 @@ static inline int OPTBWDImplementation(C
for (j = 0; j < oldProgram[i]->retc; ++j)
/* refineLeftjoin =
pushReturn(malBlock, refineLeftjoin, getArg(oldProgram[i], j)); */
refineLeftjoin = pushArgument(malBlock,
refineLeftjoin, approximations[getArg(oldProgram[i], j)]);
+ if(match_function(oldProgram[i], groupRef,
multicolumnsRef))
+ refineLeftjoin = pushArgument(malBlock,
refineLeftjoin, leftJoinResultLeftInputs[getArg(oldProgram[i], 2)]);
pushInstruction(malBlock, refineLeftjoin);
if(match_function(oldProgram[i], algebraRef,
leftjoinRef)){
leftJoinResultLeftInputs[getDestVar(refineLeftjoin)] = getArg(refineLeftjoin,
1);
- } else if(match_function(oldProgram[i],
groupRef, multicolumnsRef)){
- InstrPtr groupReduction =
newInstruction(malBlock, ASSIGNsymbol);
- rename_function(groupReduction,
GDKstrdup(algebraRef), GDKstrdup(leftjoinRef), (int[]){0}, client);
- groupReduction = pushReturn(malBlock,
groupReduction, getArg(oldProgram[i], 1));
- groupReduction = pushArgument(malBlock,
groupReduction, leftJoinResultLeftInputs[getArg(oldProgram[i], 2)]);
- groupReduction = pushArgument(malBlock,
groupReduction, getArg(oldProgram[i], 1));
- pushInstruction(malBlock,
groupReduction);
}
}
} else {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list