Changeset: e6002985f46b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e6002985f46b Modified Files: monetdb5/extras/bwd/operations.c monetdb5/extras/bwd/utilities.c Branch: bwd Log Message:
* still working on true bitwise processing (single attribute selections work for all but the last selected value :-)) Unterschiede (130 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 @@ -431,52 +431,66 @@ str BWDThetauselectApproximate(bat *res, } static inline unsigned int refinementLoop(str OP, str OP2, const int value1, const int value2, const size_t candidateCount, - const clHead* compressedHead, const clTail* compressedTail, const unsigned char* residuals, const oid* inputPositions, - const int tailApproximationBytes, const int tailResidualBits, - oid* positionRegion){ + const clHead* compressedHead, const clTail* compressedTail, const unsigned int* residuals, const oid* inputPositions, + const int tailApproximationBits, const int tailResidualBits, + oid* positionRegion, unsigned int* data){ - const int tailApproximationMask = (1<<(tailApproximationBytes*8))-1; + const int tailApproximationMask = (1<<tailApproximationBits)-1; const unsigned int residualMask = (1 << tailResidualBits)-1; unsigned int i=0, j=0, inputPositionsI = 0; if(1){/* use cpp | egrep -v "^#" | indent | pbcopy to expand */ - + const unsigned int targetTypeBits = sizeof(int)*8; + const unsigned int* vals = (unsigned int*) compressedTail->elements; #define refineLoopDoubleOperator(comparator, comparator2, positionIsTruePositiveCondition, residualPosition) \ - while(i < candidateCount) { \ - const unsigned int index = compressedHead->positions[i]; \ - const int slotI = tailApproximationBytes*8*i/(sizeof(int)*8); \ - const int offset = (tailApproximationBytes*8*i)%(sizeof(int)*8); \ - const unsigned int compressedValue = (((unsigned int*)compressedTail->elements)[slotI] >> (8*sizeof(int)-offset-tailApproximationBytes*8)) & tailApproximationMask; \ - const size_t residualSlotI = (residualPosition*tailResidualBits)/32; \ - const unsigned int residualOffset = (residualPosition*tailResidualBits)%32; \ - const unsigned int residual = (((unsigned int*)residuals)[residualSlotI] \ - >> (32-residualOffset-tailResidualBits))&residualMask; \ - const int deCompressedValue = compressedTail->base+ \ - (compressedValue << tailResidualBits) \ - + residual; \ - if(i<10) printf ("%u: %d (residual: %d)\n", index, \ - deCompressedValue, residual); \ - { \ - const int positionIsCorrectPositive = \ - (positionIsTruePositiveCondition); \ - positionRegion[j] = index; \ - j+= ((deCompressedValue comparator value1) & \ - (deCompressedValue comparator2 value2) & \ - (positionIsCorrectPositive)); \ - inputPositionsI += positionIsCorrectPositive; \ - i++; \ - } \ - } + while(i < candidateCount) { \ + const unsigned int index = compressedHead->positions[i]; \ + const unsigned int slotI = tailApproximationBits*i/targetTypeBits; \ + const unsigned int offset = (tailApproximationBits*i)%targetTypeBits; \ + const unsigned int compressedValue = \ + (((offset+tailApproximationBits)<=targetTypeBits)* \ + (vals[slotI] >> (targetTypeBits-offset-tailApproximationBits)) & tailApproximationMask) \ + + \ + (((offset+tailApproximationBits)>targetTypeBits)?(( \ + (vals[slotI]<<(tailApproximationBits-targetTypeBits+offset)) \ + + (vals[slotI+1]>>(targetTypeBits-(tailApproximationBits-targetTypeBits+offset))))&tailApproximationMask):0) \ + ; \ + const size_t residualSlotI = (residualPosition*tailResidualBits)/32; \ + const unsigned int residualOffset = (residualPosition*tailResidualBits)%32; \ + const unsigned int residual = \ + (residualOffset+tailResidualBits <= targetTypeBits)* \ + ((residuals[residualSlotI] \ + >> (targetTypeBits-residualOffset-tailResidualBits))&residualMask) \ + + (residualOffset+tailResidualBits > targetTypeBits)* \ + (((residuals[residualSlotI]<<(tailResidualBits-targetTypeBits+residualOffset)) \ + + (residuals[residualSlotI+1] >> \ + (targetTypeBits-(tailResidualBits-targetTypeBits+residualOffset))) )& residualMask); \ + const int deCompressedValue = compressedTail->base+ \ + (compressedValue << tailResidualBits) \ + + residual; \ + if(i<10) printf ("%u: %d (residual: %u)\n", index, \ + deCompressedValue, residual); \ + { \ + const int positionIsCorrectPositive = \ + (positionIsTruePositiveCondition); \ + positionRegion[j] = index; \ + j+= ((deCompressedValue comparator value1) & \ + (deCompressedValue comparator2 value2) & \ + (positionIsCorrectPositive)); \ + inputPositionsI += positionIsCorrectPositive; \ + i++; \ + } \ + } #define refineLoopSingleOperator(comparator, positionIsTruePositiveCondition, residualPosition) \ while(i < candidateCount) { \ const unsigned int index = compressedHead->positions[i]; \ - const int slotI = tailApproximationBytes*8*i/(sizeof(int)*8); \ - const int offset = (tailApproximationBytes*8*i)%(sizeof(int)*8); \ - const unsigned int compressedValue = (((unsigned int*)compressedTail->elements)[slotI] >> (8*sizeof(int)-offset-tailApproximationBytes*8)) & tailApproximationMask; \ + const int slotI = tailApproximationBits*i/(sizeof(int)*8); \ + const int offset = (tailApproximationBits*i)%(sizeof(int)*8); \ + const unsigned int compressedValue = (vals[slotI] >> (8*sizeof(int)-offset-tailApproximationBits)) & tailApproximationMask; \ const size_t residualSlotI = (residualPosition*tailResidualBits)/32; \ const unsigned int residualOffset = (residualPosition*tailResidualBits)%32; \ - const unsigned int residual = (((unsigned int*)residuals)[residualSlotI] \ + const unsigned int residual = (residuals[residualSlotI] \ >> (32-residualOffset-tailResidualBits))&residualMask; \ const int deCompressedValue = compressedTail->base+ \ (compressedValue << tailResidualBits) \ @@ -613,10 +627,10 @@ str uselectrefine(bat *res, bat *bid, pt { unsigned int j = refinementLoop(OP, OP2, *(int*)val, val2?*(int*)val2:0, candidateCount, - compressedHead, compressedTail, residuals, (oid*) Hloc(data, BUNfirst(data)), - batTailApproximationBits(approximation)/8 - batTailOffsetBits(approximation)/8, + compressedHead, compressedTail, (unsigned int*)residuals, (oid*) Hloc(data, BUNfirst(data)), + batTailApproximationBits(approximation), batTailResidualBits(approximation), - positionRegion); + positionRegion, (unsigned int*) data->T->heap.base); if(1) printf ("%s reduced the result from %zd to %d\n", __func__, Hloc(data, BUNfirst(data))?MIN(candidateCount, BATcount(data)):candidateCount, j); BATsetcount(result, j); 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 @@ -377,7 +377,7 @@ unsigned int decomposeIntArray(const int { // residual const size_t slotI = (i*residualBits)/32; const unsigned int offset = (i*residualBits)%32; - if(offset+residualBits < 32) { + if(offset+residualBits <= 32) { ((unsigned int*)slot->residuals)[slotI] |= (((subject[i]-approximation->base)&residualMask)<<(32-offset-residualBits)); } else { ((unsigned int*)slot->residuals)[slotI] |= (((subject[i]-approximation->base)&residualMask)>>(residualBits-(32-offset))); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list