Changeset: 9d0af5c9ca3f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9d0af5c9ca3f
Modified Files:
monetdb5/extras/bwd/91_bwd.sql
monetdb5/extras/bwd/bwd.c
monetdb5/extras/bwd/operations.c
monetdb5/extras/bwd/opt_bwd.mal
monetdb5/extras/bwd/optimizer.c
monetdb5/extras/bwd/utilities.c
monetdb5/extras/bwd/utilities.h
Branch: bwd
Log Message:
* introduced lot's of hacks to get tpch q14 running (q1, q6 and q14 run through
now)
Unterschiede (gekürzt von 587 auf 300 Zeilen):
diff --git a/monetdb5/extras/bwd/91_bwd.sql b/monetdb5/extras/bwd/91_bwd.sql
--- a/monetdb5/extras/bwd/91_bwd.sql
+++ b/monetdb5/extras/bwd/91_bwd.sql
@@ -20,7 +20,7 @@ returns varchar(4096) external name bwd.
create function bwdecomposeint(col integer, bits integer)
returns varchar(4096) external name bwd.decompose;
-create function bwdecomposefk(schema varchar(24), tabl varchar(24), columnn
varchar(24), bits integer)
+create function bwdecomposefk(scema varchar(24), tabl varchar(24), columnn
varchar(24), bits integer)
returns varchar(4096) external name bwd.decomposefk;
diff --git a/monetdb5/extras/bwd/bwd.c b/monetdb5/extras/bwd/bwd.c
--- a/monetdb5/extras/bwd/bwd.c
+++ b/monetdb5/extras/bwd/bwd.c
@@ -118,6 +118,9 @@ str bwdecompose(bat * res, bat * subject
} else if (Tsize(subject) == 4){
BATsetprop(subject, batRegistryIndex, TYPE_int,
(int[]){decomposeIntArray((int*)Tloc(subject, BUNfirst(subject)),
subject->batCount, *approximationBits)});
snprintf(buffer, 4096, "successfully decomposed integer bat
%d", subject->batCacheid);
+ } else if (BATttype(subject) == TYPE_oid && !BATtvoid(subject)){
+ BATsetprop(subject, batRegistryIndex, TYPE_lng,
(lng[]){transferOIDArray((oid*)Tloc(subject, BUNfirst(subject)),
subject->batCount, *approximationBits)});
+ snprintf(buffer, 4096, "successfully decomposed long integer
bat %d", subject->batCacheid);
} else if (Tsize(subject) == 8){
BATsetprop(subject, batRegistryIndex, TYPE_lng,
(lng[]){decomposeLngArray((lng*)Tloc(subject, BUNfirst(subject)),
subject->batCount, *approximationBits)});
snprintf(buffer, 4096, "successfully decomposed long integer
bat %d", subject->batCacheid);
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
@@ -68,6 +68,7 @@ clTail getTailHeader(cl_mem memoryObject
clHead* getPositionsColumn(cl_mem memoryObject, clHead* buffer, size_t*
bufferSize){
cl_int err = 0;
+ assert(memoryObject);
if(!buffer){
if(eagerBufferLoading){
clGetMemObjectInfo(memoryObject, CL_MEM_SIZE,
sizeof(size_t), bufferSize, NULL);
@@ -154,13 +155,19 @@ size_t calculatedBufferSize(size_t headC
#define NOT_DECOMPOSED GDKstrdup("input bat not decomposed")
str BWDLeftJoinApproximate(bat * res, bat * l, bat * r){
BAT *left = BATdescriptor(*l), *right = BATdescriptor(*r);
- if(!batTailIsDecomposed(right)){
+ str result = NOT_IMPLEMENTED;
+ if(!batTailIsDecomposed(right) && !(BAThvoid(right) &&
BATtvoid(right))){
printf("bwd.%s : bat is not decomposed: %d, no approximation
can be provided\n", __func__, *r);
BBPreleaseref(right->batCacheid);
return MAL_SUCCEED;
}
-
- if(BAThvoid(left) && BAThvoid(right) && right->tseqbase != oid_nil){
+ if(BAThvoid(left) && BAThvoid(right) && right->T->type == TYPE_void){
+ BBPincref(*res = *l, 1);
+ result = MAL_SUCCEED;
+ } else if(BAThvoid(left) && left->T->type == TYPE_void &&
BAThvoid(right)){
+ BBPincref(*res = *r, 1);
+ result = MAL_SUCCEED;
+ } else if(BAThvoid(left) && BAThvoid(right) && right->tseqbase !=
oid_nil){
cl_int err;
int headCount; // :-)
cl_kernel projectKernel;
@@ -170,6 +177,7 @@ str BWDLeftJoinApproximate(bat * res, ba
int i;
if(!leftColumn) leftColumn =
batHeadApproximation(BATmirror(left));
if(!rightColumn) rightColumn =
batHeadApproximation(BATmirror(right));
+ assert(leftColumn && rightColumn);
projectKernel =
clCreateKernel(getProjectionLeftjoinProgram(batTailApproximationBits(right),
batTailOffsetBits(right)), "project", &err);
if(err) printf("#%s, clCreateKernel: %s;\n", __func__,
clError(err));
@@ -211,12 +219,21 @@ str BWDLeftJoinApproximate(bat * res, ba
printf("#%s, clEnqueueNDRangeKernel: %s, %s:%u;\n",
__func__, clError(err), __FILE__, __LINE__);
if (synchronousGPU) clFinish(getCommandQueue());
BBPkeepref((*res = result->batCacheid));
+ return MAL_SUCCEED;
+ } 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);
+ }
+ {
+ BAT* approximation = BATdescriptor(*res);
+ if(batTailApproximation(approximation))
assert(batTailPositions(approximation));
+
+ BBPreleaseref(*res);
+ }
BBPreleaseref(left->batCacheid);
BBPreleaseref(right->batCacheid);
- return MAL_SUCCEED;
- }
- 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 NOT_IMPLEMENTED;
+
+
+ return result;
};
static inline int decompress_int_Value(const int approximationI, const int
approximationBits, const int offsetBits, const clTail* compressedTail, const
unsigned int* residuals, const unsigned int residualI){
@@ -256,6 +273,23 @@ static inline int decompress_int_Value(c
return deCompressedValue;
}
+static inline lng decompress_lng_Value_without_residual(const int
approximationI, const int approximationBits, const clTail* compressedTail){
+ const int approximationMask = (1<<(approximationBits))-1;
+ const unsigned int* vals = (unsigned int*) compressedTail->elements;
+ const unsigned int targetTypeBits = sizeof(int)*8;
+ const unsigned int slotI =
(approximationBits)*approximationI/(sizeof(int)*8);
+ const unsigned int offset =
((approximationBits)*approximationI)%(sizeof(int)*8);
+
+ const unsigned int compressedValue =
+ (((offset+approximationBits)<=targetTypeBits)*
+ (vals[slotI] >> (targetTypeBits-offset-approximationBits)) &
approximationMask)
+ + (((offset+approximationBits)>targetTypeBits)?
+
(((vals[slotI]<<(approximationBits-targetTypeBits+offset))
+ +
(vals[slotI+1]>>(targetTypeBits-(approximationBits-targetTypeBits+offset))))&approximationMask):0);
+
+ return compressedTail->base+ compressedValue;
+}
+
static inline int decompress_int_Value_without_residual(const int
approximationI, const int approximationBits, const clTail* compressedTail){
const int approximationMask = (1<<(approximationBits))-1;
const unsigned int* vals = (unsigned int*) compressedTail->elements;
@@ -336,6 +370,7 @@ str BWDLeftJoinRefine(bat * res, bat * l
BAT* right = BATdescriptor(*r);
BAT* refinement = NULL;
BAT* approximation = BATdescriptor(*approx);
+ str result = MAL_SUCCEED;
const size_t approximationBits =
batTailApproximationBits(right);
const size_t offsetBits = batTailOffsetBits(right);
@@ -343,22 +378,12 @@ str BWDLeftJoinRefine(bat * res, bat * l
/* BATnew(approximation->htype, approximation->ttype,
approximation->batCount); */
- if(0 && BAThvoid(left) && BATtvoid(left) && BAThvoid(right) &&
right->tseqbase != oid_nil){
- // not very likely optimization, hence disabled
- const unsigned char* residuals =
batTailResiduals(right);
- const unsigned int residualBytes =
(32-approximationBits)/8;
- uint i;
- register int* outputRegion = (int*) Tloc(refinement,
BUNfirst(refinement));
- const int* approximationRegion = (int*)
Tloc(approximation, BUNfirst(approximation));
- const size_t offset = left->tseqbase;
-
- if(!batTailIsDecomposed(right))
- throw (MAL, "bwd.BWDLeftJoinApproximate", "bat
is not decomposed: %d", *r);
- refinement = BATnew(ATOMtype(left->htype),
ATOMtype(right->ttype), left->batCount);
- printf ("%s returning bat of type [%s, %s]\n",
__func__, typeNames[BAThtype(refinement)], typeNames[BATttype(refinement)]);
- BATsetcount(refinement, approximation->batCount);
- for (i = 0; i < approximation->batCount; ++i)
- outputRegion[i] = approximationRegion[i] +
((*((unsigned int*) (residuals + (i+offset)*residualBytes))) >>
approximationBits);
+ if(BAThvoid(left) && BAThvoid(right) && BATtvoid(right)){
+ BBPincref(*res = *l, 1);
+ result = MAL_SUCCEED;
+ } else if(BAThvoid(left) && left->T->type == TYPE_void &&
BAThvoid(right)){
+ BBPincref(*res = *r, 1);
+ result = MAL_SUCCEED;
} else if(BAThvoid(right) && right->tseqbase != oid_nil){
// we essentially perform a merge-join of the precise
positions (left tail) and the approximate positions to get the approximate
values of the super result set
// this is okay because the approximate positions are a
superset of the precise positions and the position lists have the same
permutation
@@ -377,16 +402,19 @@ str BWDLeftJoinRefine(bat * res, bat * l
if(batTailResidualBits(approximation) == 0){
#define expansionLoop(type) {
\
- unsigned int i;
\
+ unsigned int i;
\
type* refinementRegion = (type*)
Tloc(refinement, \
BUNfirst(refinement)); \
for (i = 0; i< left->batCount; ++i)
\
refinementRegion[i] =
decompress_##type##_Value_without_residual( \
i, approximationBits,
supersetApproximateValuesColumn \
);
\
- }
+ }
switch(right->T->width){
+ case 8:
+ expansionLoop(lng);
+ break;
case 4:
expansionLoop(int);
break;
@@ -408,53 +436,57 @@ str BWDLeftJoinRefine(bat * res, bat * l
#define refinementLoop(type) {
\
type* refinementRegion = (type*)
Tloc(refinement, \
-
BUNfirst(refinement)); \
+
BUNfirst(refinement)); \
for (i = 0; i <
supersetPositionsColumn->count; ++i) { \
if(supersetPositionsColumn->positions[i] == *positionRegion){ \
refinementRegion[refinementCount++] =
\
-
decompress_##type##_Value(i, approximationBits, offsetBits, \
-
supersetApproximateValuesColumn, \
-
residuals,
*positionRegion); \
- positionRegion++;
\
+
decompress_##type##_Value(i, approximationBits, offsetBits, \
+
supersetApproximateValuesColumn, \
+
residuals, *positionRegion); \
+
positionRegion++;
\
}
\
}
\
}
switch(right->T->width){
- case 4:
- refinementLoop(int);
- break;
- case 1:
- refinementLoop(char);
- break;
- default:
- throw (MAL, "bwd problem", "this type
(%d-byte) for %s is not implemented, %s:%d", ATOMsize(right->ttype), __func__,
__FILE__, __LINE__);
- }
+ case 4:
+ refinementLoop(int);
+ break;
+ case 1:
+ refinementLoop(char);
+ break;
+ default:
+ throw (MAL, "bwd problem", "this type (%d-byte)
for %s is not implemented, %s:%d", ATOMsize(right->ttype), __func__, __FILE__,
__LINE__);
+ }
#undef refinementLoop
BATsetcount(refinement, refinementCount);
BATseqbase(refinement, 0);
}
- GDKfree(supersetPositionsColumn);
- GDKfree(supersetApproximateValuesColumn);
+ GDKfree(supersetPositionsColumn);
+ GDKfree(supersetApproximateValuesColumn);
- if(!BAThvoid(left)){ // propagate left head column
+ if(!BAThvoid(left)){ // propagate left head
column
BATseqbase(BATmirror(refinement), oid_nil);
refinement = VIEWcreate(BATmark(left,
oid_nil),refinement);
}
- if(BATttype(right) == TYPE_str){ // propagate right heap
+ if(BATttype(right) == TYPE_str){ // propagate
right heap
if (right->batRestricted == BAT_READ) {
- assert(right->T->vheap->parentid > 0);
- BBPshare(right->T->vheap->parentid);
- refinement->T->vheap = right->T->vheap;
- }
+ assert(right->T->vheap->parentid > 0);
+ BBPshare(right->T->vheap->parentid);
+ refinement->T->vheap = right->T->vheap;
}
-
+ }
+ if(refinement)
+ BBPkeepref(*res =
refinement->batCacheid);
+ } else {
+ printf("unimplemented case in %s, %s:%d", __func__,
__FILE__, __LINE__);
+ abort();
}
-
- BBPkeepref(*res = refinement->batCacheid);
BBPreleaseref(approximation->batCacheid);
- return MAL_SUCCEED;
+ BBPreleaseref(left->batCacheid);
+ BBPreleaseref(right->batCacheid);
+ return result;
}
};
@@ -480,7 +512,7 @@ static inline str uselect(bat *res, bat
assert(ATOMstorage(BATttype(data)) == TYPE_int); // type specific
if(!batTailIsDecomposed(data))
throw (MAL, "bwd problem", "while running %s, I noticed that
bat is not decomposed: %s", __func__, resolveBatToAttribute(data->batCacheid,
cntxt));
- result = BATnew(BAThtype(data), tailType, 0); //TODO: not sure if we
actually need to allocate space here (count could be 0)
+ result = BATnew(data->H->type==TYPE_void?TYPE_oid:data->H->type,
tailType, 0); //TODO: not sure if we actually need to allocate space here
(count could be 0)
{
const clTail dataHeader =
getTailHeader(batTailApproximation(data));
@@ -806,37 +838,37 @@ str BWDThetauselectRefine(bat *res, bat
}
str BWDtmark(int *res, int *bid, oid *base){
str returnValue = ALGtmark(res, bid, base);
- if(*res){ // propagate head approximation
+ BAT* input = BATdescriptor(*bid);
+ if(*res && input->H->type != TYPE_void){ // propagate head approximation
cl_int err;
- BAT* input;
const unsigned int newIndex =
getNextFreeDecomposedBATSlotIndex();
DecomposedBATSlot* slot =
getDecomposedBATSlotForIndex(newIndex);
BAT* result = BATdescriptor(*res);
BATsetprop(result, batRegistryIndex, TYPE_int,
(int[]){newIndex});
BBPreleaseref(*res);
- input = BATdescriptor(*bid);
slot->headApproximation = batHeadApproximation(input);
- if(0) printf ("retaining %p\n", slot->headApproximation);
+ if(!slot->headApproximation) slot->headApproximation =
batTailPositions(BATmirror(input));
+ assert(slot->headApproximation);
+
+ if(1) printf ("retaining %p\n", slot->headApproximation);
if((err=clRetainMemObject(slot->headApproximation)))
printf("#%s, clRetainMemObject: %s;\n", __func__,
clError(err));
-
- BBPreleaseref(*bid);
}
+ BBPreleaseref(*bid);
return returnValue;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list