Changeset: dc9095374fc7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dc9095374fc7
Modified Files:
monetdb5/extras/bwd/bwd.c
monetdb5/extras/bwd/operations.c
monetdb5/extras/bwd/utilities.c
Branch: bwd
Log Message:
* working on varchar-attribute decomposition to ge TPC-H Q1 running
Unterschiede (218 Zeilen):
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
@@ -110,21 +110,21 @@ str bwdecompose(bat * res, bat * subject
if (VIEWtparent(subject))
subject = BATdescriptor(abs(VIEWtparent(subject)));
result = BATnew(TYPE_void, TYPE_str, 0);
+ if(approximationBits[0] > Tsize(subject)*8)
+ die("dude, bat %d only has %d bits, how am I supposed to use %d
bits for approximation\n", subject->batCacheid, Tsize(subject)*8,
approximationBits[0]);
+
if(batTailIsDecomposed(subject)) {
snprintf(buffer, 4096, "bat %d already decomposed",
subject->batCacheid);
} 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(Tsize(subject) == 1){
- if(approximationBits[0] > Tsize(subject)*8){
- die("dude, bat %d only has %d bits, how am I supposed
to use %d bits for approximation\n", subject->batCacheid, Tsize(subject)*8,
approximationBits[0]);
- } else {
BATsetprop(subject, batRegistryIndex, TYPE_int,
(int[]){decomposeVarchar1Array(Tloc(subject, BUNfirst(subject)),
subject->batCount, Tsize(subject), Tbase(subject), *approximationBits)});
snprintf(buffer, 4096, "successfully decomposed char
bat %d", subject->batCacheid);
- }
} else {
snprintf(buffer, 4096, "bat %d cannot be decomposed because it
is not a 32 or 8-bit type", subject->batCacheid);
}
+ printf ("%s\n", buffer);
BUNappend(result, buffer, 0);
BBPkeepref(*res = result->batCacheid);
BBPreleaseref(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
@@ -195,7 +195,7 @@ str BWDLeftJoinApproximate(bat * res, ba
return NOT_IMPLEMENTED;
};
-static inline int decompressIntValue(const int approximationI, const int
approximationBits, const int offsetBits, const clTail* compressedTail, const
unsigned int* residuals, const unsigned int residualI){
+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){
const unsigned int residualBits = 32-approximationBits-offsetBits;
const unsigned int residualMask = (1 << residualBits)-1;
const int approximationMask = (1<<(approximationBits))-1;
@@ -232,6 +232,43 @@ static inline int decompressIntValue(con
return deCompressedValue;
}
+static inline char decompress_char_Value(const int approximationI, const int
approximationBits, const int offsetBits, const clTail* compressedTail, const
unsigned int* residuals, const unsigned int residualI){
+ const unsigned int residualBits = 8-approximationBits-offsetBits;
+ const unsigned int residualMask = (1 << residualBits)-1;
+ 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);
+
+
+ const size_t residualSlotI = (((unsigned long)residualI)*((unsigned
long)residualBits))/32UL;
+ const unsigned int residualOffset = (residualI*residualBits)%32;
+ const unsigned int residual =
+ (residualOffset+residualBits <= targetTypeBits)*
+ ((residuals[residualSlotI]
+ >>
(targetTypeBits-residualOffset-residualBits))&residualMask)
+ + (residualOffset+residualBits > targetTypeBits)*
+
(((residuals[residualSlotI]<<(residualBits-targetTypeBits+residualOffset))
+ + (residuals[residualSlotI+1] >>
+
(targetTypeBits-(residualBits-targetTypeBits+residualOffset))) )& residualMask);
+
+ const int deCompressedValue = compressedTail->base+
+ (compressedValue << residualBits)
+ + residual;
+
+ return deCompressedValue;
+}
+
str BWDLeftJoinRefine(bat * res, bat * l, bat * r, bat * approx){
if (!approx || !*approx) {
@@ -279,22 +316,37 @@ str BWDLeftJoinRefine(bat * res, bat * l
supersetApproximateValuesColumn =
getApproximateValuesColumn(batTailApproximation(approximation),
GDKmalloc(bufferSize), &bufferSize);
-
refinement = BATnew(TYPE_void, ATOMtype(right->ttype),
left->batCount);
{
-
- int* refinementRegion = (int*) Tloc(refinement,
BUNfirst(refinement));
-
oid* positionRegion = (oid*) Tloc(left,
BUNfirst(left));
size_t refinementCount = 0;
const unsigned int* residuals = (unsigned
int*)batTailResiduals(right);
uint i;
- for (i = 0; i < supersetPositionsColumn->count;
++i) {
-
if(supersetPositionsColumn->positions[i] == *positionRegion){
-
refinementRegion[refinementCount++] = decompressIntValue(i, approximationBits,
offsetBits, supersetApproximateValuesColumn, residuals, *positionRegion);
- positionRegion++;
- }
+
+#define refinementLoop(type) {
\
+ type* refinementRegion = (type*)
Tloc(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++;
\
+ }
\
+ }
\
}
+ 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__);
+ }
+#undef refinementLoop
BATsetcount(refinement, refinementCount);
BATseqbase(refinement, 0);
}
@@ -912,7 +964,7 @@ str BWDSemijoinRefine(int *res, int *lid
}
\
}
\
refinementRegion[refinementCount++] =
\
-
decompressIntValue(i, approximationBits,
\
+
decompress_int_Value(i, approximationBits,
\
offsetBits, supersetApproximateValuesColumn, \
residuals, supersetPositionsColumn->positions[i]); \
}
@@ -1234,6 +1286,8 @@ str BWDMulticolumnGroupApproximate(Clien
printf("bwd.%s : bat is not decomposed: %d, no
approximation can be provided\n", __func__, inputs[i]->batCacheid);
result = NOT_DECOMPOSED;
}
+ assert(batTailResidualBits(inputs[i]) == 0); // we don't yet do
A&R grouping, thus we need all data on the GPU
+
}
if(result == MAL_SUCCEED){ // get input objects and parameters
@@ -1348,6 +1402,33 @@ str BWDGroupRefine(int *rethisto, int *r
return MAL_SUCCEED;
}
+BAT* materializeBATInHostMemory(BAT* input){
+ return input;
+}
+
str BWDMulticolumnGroupRefine(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci){
- throw(MAL, __func__, "not implemented yet: %s", __func__);
+ int *retbid = (int*) getArgReference(stk,pci,0);
+ int *rethisto = (int*) getArgReference(stk,pci,1);
+ str result = MAL_SUCCEED;
+ int i;
+ BAT **inputs = (BAT**) GDKzalloc(sizeof(BAT*) * pci->argc);
+
+ for (i = 0; i < pci->argc-4; ++i){
+ inputs[i] = BATdescriptor(*(int*) getArgReference(stk,pci,i+2));
+ if (inputs[i] == NULL)
+ throw(MAL, __func__, RUNTIME_OBJECT_MISSING);
+ }
+
+ {
+ BAT *approximationretbid = BATdescriptor(*(int*)
getArgReference(stk,pci,pci->argc-2));
+ BAT *approximationrethisto = BATdescriptor(*(int*)
getArgReference(stk,pci, pci->argc-1));
+ BBPincref(*retbid =
materializeBATInHostMemory(approximationretbid)->batCacheid, 1);
+ BBPincref(*rethisto =
materializeBATInHostMemory(approximationrethisto)->batCacheid, 1);
+ BBPreleaseref(*retbid);
+ BBPreleaseref(*rethisto);
+ }
+ for (i = 0; i< pci->argc-4; ++i)
+ BBPreleaseref(inputs[i]->batCacheid);
+
+ return result;
}
diff --git a/monetdb5/extras/bwd/utilities.c b/monetdb5/extras/bwd/utilities.c
--- a/monetdb5/extras/bwd/utilities.c
+++ b/monetdb5/extras/bwd/utilities.c
@@ -269,9 +269,9 @@ int batTailOffsetValue(const BAT* subjec
return
bwdRegistry[rightTailApproximationProperty->v.val.ival].isPersistentBAT;
}
- size_t batTailResidualBits(const BAT* subject){
+size_t batTailResidualBits(const BAT* subject){
assert(ATOMsize(subject->ttype) > 0);
- return ATOMsize(subject->ttype)*8 - batTailApproximationBits(subject) -
batTailOffsetBits(subject);
+ return subject->T->width*8 - batTailApproximationBits(subject) -
batTailOffsetBits(subject);
}
const unsigned char* batTailResiduals(const BAT* subject){
PROPrec* rightTailApproximationProperty;
@@ -440,7 +440,7 @@ bounds findVarchar1Bounds(const char* su
bounds result = {value, value};
unsigned int i;
for (i = 1; i < size; ++i) {
- value = *getVarcharValue(subject, dictionary, i, width);
+ value = VarHeapValRaw(subject, i, width);
result.min = MIN(result.min, value);
result.max = MAX(result.max, value);
}
@@ -472,7 +472,7 @@ unsigned int decomposeVarchar1Array(cons
approximation->count = size;
for (i = 0; i < size; ++i) {
- const char value = *getVarcharValue(subject, dictionary, i,
width);
+ const int value = VarHeapValRaw(subject, i, width);
{ // approximation
const size_t slotI = (i*approximationBits)/32;
const unsigned int offset = (i*approximationBits)%32;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list