Changeset: 96c196a8c4f1 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=96c196a8c4f1 Modified Files: monetdb5/extras/bwd/operations.c Branch: bwd Log Message:
* fixed a bug in the alignment of residual and approximation of uselects
Unterschiede (173 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
@@ -434,19 +434,19 @@ static inline unsigned int refinementLoo
const clHead* compressedHead, const clTail* compressedTail, const
unsigned char* residuals, const oid* inputPositions,
const int tailApproximationBytes, const int tailResidualBits,
oid* positionRegion){
-/* use cpp | egrep -v "^#" | indent | pbcopy to expand */
const int tailApproximationMask = (1<<(tailApproximationBytes*8))-1;
const unsigned int residualMask = (1 << tailResidualBits)-1;
const unsigned int residualBytes = tailResidualBits/8;
unsigned int i=0, j=0, inputPositionsI = 0;
+ if(1){/* use cpp | egrep -v "^#" | indent | pbcopy to expand */
#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 = (index*tailResidualBits)/32;
\
- const unsigned int residualOffset =
(index*tailResidualBits)%32; \
+ 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+
\
@@ -537,8 +537,8 @@ case '=': {
#undef refineLoop
#undef refineLoopSingleOperator
#undef refineLoopDoubleOperator
+ }
return j;
-
}
str uselectrefine(bat *res, bat *bid, ptr val, str OP, ptr val2, str OP2, bat
*approx, Client context) {
@@ -789,7 +789,7 @@ str BWDSemijoinRefine(int *res, int *lid
if(BAThvoid(left) && ATOMstorage(BATttype(left)) == TYPE_int
&& BAThtype(right) == TYPE_oid){ // TODO: type specific
size_t bufferSize;
struct timespec before, after;
- unsigned char* filteredResiduals = NULL;
+ unsigned int* filteredResiduals = NULL;
clHead* supersetPositionsColumn;
clTail* supersetApproximateValuesColumn;
refinement = BATnew(TYPE_void, BATttype(left),
right->batCount);
@@ -810,7 +810,7 @@ str BWDSemijoinRefine(int *res, int *lid
{
if(supersetPositionsColumn){
- { // if the approximation is empty, the
memory objects are NULL
+ // if the approximation is empty, the
memory objects are NULL
int* refinementRegion = (int*)
Tloc(refinement, BUNfirst(refinement));
const unsigned int* residuals =
(unsigned int*)batTailResiduals(left);
const unsigned int
residualBytes = Tsize(left)-approximationBits/8;
@@ -823,7 +823,7 @@ str BWDSemijoinRefine(int *res, int *lid
size_t refinementCount
= 0;
filteredResiduals =
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
- {
+ if(0){
#define projectResidualsLoop(residualPosition)
\
for ( i = j =
0; j < BATcount(right); ++j) { \
while(supersetPositionsColumn->positions[i]
\
@@ -831,46 +831,74 @@ str BWDSemijoinRefine(int *res, int *lid
i++;
\
\
{
\
- const
size_t residualSlotI = (residualPosition*residualBits)/32; \
- const
unsigned int residualOffset = (residualPosition*residualBits)%32; \
- const
unsigned int residual = (((unsigned int*)residuals)[residualSlotI] \
-
>>
(32-residualOffset-residualBits))&residualMask; \
+
const size_t residualSlotI = (residualPosition*residualBits)/32; \
+
const unsigned int residualOffset = (residualPosition*residualBits)%32; \
+
const unsigned int residual = (((unsigned int*)residuals)[residualSlotI] \
+
>>
(32-residualOffset-residualBits))&residualMask; \
\
- const
size_t outResidualSlotI = (refinementCount*residualBits)/32; \
- const
size_t outResidualOffset = (refinementCount*residualBits)%32; \
-
filteredResiduals[outResidualSlotI] |=
\
-
(residual<<(32-outResidualOffset-residualBits)); \
-
if(refinementCount<10)
\
-
printf ("projected residual %u from %u to %lu, slot %lu: %d\n", \
-
residual, residualPosition, refinementCount, \
-
outResidualSlotI,
filteredResiduals[outResidualSlotI]); \
- }
\
+
const size_t outResidualSlotI = (refinementCount*residualBits)/32; \
+
const size_t outResidualOffset = (refinementCount*residualBits)%32; \
+
filteredResiduals[outResidualSlotI] |=
\
+
(residual<<(32-outResidualOffset-residualBits)); \
+
if(refinementCount<10)
\
+
printf ("projected residual %u from %u to %lu, slot %lu: %d\n", \
+
residual, residualPosition,
refinementCount, \
+
outResidualSlotI,
filteredResiduals[outResidualSlotI]); \
+ }
\
refinementRegion[refinementCount++] =
\
decompressIntValue(i, approximationBits,
\
offsetBits, supersetApproximateValuesColumn, \
residuals, supersetPositionsColumn->positions[i]); \
}
if
(BAThdense(left)) { // dense headed but, thus we use the positions for residual
lookups
-
projectResidualsLoop(supersetPositionsColumn->positions[i]);
+
projectResidualsLoop(supersetPositionsColumn->positions[i]);
} else { // bat
is oid-headed, thus we use the iterator
-
projectResidualsLoop(i);
+
projectResidualsLoop(i);
+ }
+#undef projectResidualsLoop
+ } else
{
+ if
(BAThdense(left)) {
+ //dense
headed but, thus we use the positions for residual lookups
+
for (i = j = 0; j < BATcount(right); ++j) {
+
while (supersetPositionsColumn->positions[i] != ((oid *)
right->H->heap.base)[j])
+
i++; {
+
const size_t residualSlotI =
(supersetPositionsColumn->positions[i] * residualBits) / 32;
+
const unsigned int residualOffset =
(supersetPositionsColumn->positions[i] * residualBits) % 32;
+
const unsigned int residual = (((unsigned int
*)residuals)[residualSlotI] >> (32 - residualOffset - residualBits)) &
residualMask;
+
const size_t outResidualSlotI = (refinementCount *
residualBits) / 32;
+
const size_t outResidualOffset = (refinementCount *
residualBits) % 32;
+
filteredResiduals[outResidualSlotI] |= (residual << (32 -
outResidualOffset - residualBits));
+
if (refinementCount < 10)
+
printf("projected residual %u from %u to %lu, slot %lu:
%u\n", residual, supersetPositionsColumn->positions[i], refinementCount,
outResidualSlotI, filteredResiduals[outResidualSlotI]);
+
} refinementRegion[refinementCount++] = decompressIntValue(i,
approximationBits, offsetBits, supersetApproximateValuesColumn, residuals,
supersetPositionsColumn->positions[i]);
+
};
+ } else {
+ //bat
is oid - headed, thus we use the iterator
+
for (i = j = 0; j < BATcount(right); ++j) {
+
while (supersetPositionsColumn->positions[i] != ((oid *)
right->H->heap.base)[j])
+
i++; {
+
const size_t residualSlotI = (i * residualBits) / 32;
+
const unsigned int residualOffset = (i * residualBits) % 32;
+
const unsigned int residual = (((unsigned int
*)residuals)[residualSlotI] >> (32 - residualOffset - residualBits)) &
residualMask;
+
const size_t outResidualSlotI = (refinementCount * residualBits) /
32;
+
const size_t outResidualOffset = (refinementCount * residualBits) %
32;
+
filteredResiduals[outResidualSlotI] |= (residual << (32 -
outResidualOffset - residualBits));
+
if (refinementCount < 10)
+
printf("projected residual %u from %u to %lu, slot %lu: %d\n",
residual, i, refinementCount, outResidualSlotI,
filteredResiduals[outResidualSlotI]);
+
} refinementRegion[refinementCount++] = decompressIntValue(i,
approximationBits, offsetBits, supersetApproximateValuesColumn, residuals,
supersetPositionsColumn->positions[i]);
+ };
+ }
+
}
-#undef projectResidualsLoop
- }
+
BATsetcount(refinement,
refinementCount);
} else {
- const int count =
BATcount(right);
-
memcpy(refinementRegion, supersetApproximateValuesColumn->elements,
count*sizeof(int));
-/* int i; */
-/* #pragma omp parallel for */
-/* for (i = 0; i < count; ++i) { */
-/* refinementRegion[i] =
((int*)supersetApproximateValuesColumn->elements)[i]; */
-/* } */
- BATsetcount(refinement,
count);
+
memcpy(refinementRegion, supersetApproximateValuesColumn->elements,
BATcount(right)*sizeof(int));
+ BATsetcount(refinement,
BATcount(right));
}
- }
+
}else {
printf ("uh oh, %s ran into an
unimplemented case: no approximation provided\n", __func__);
}
@@ -882,7 +910,7 @@ str BWDSemijoinRefine(int *res, int *lid
if(0) printf ("%s setting residuals of %d to %p\n",
__func__, refinement->batCacheid, getDecomposedBATSlot(refinement)->residuals);
BATsetprop(refinement, batRegistryIndex, TYPE_int,
(int[]){getNextFreeDecomposedBATSlotIndex()});
- getDecomposedBATSlot(refinement)->residuals =
filteredResiduals;
+ getDecomposedBATSlot(refinement)->residuals = (unsigned
char*)filteredResiduals;
getDecomposedBATSlot(refinement)->approximationBits =
batTailApproximationBits(left);
getDecomposedBATSlot(refinement)->tailOffsetBits =
batTailOffsetBits(left);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
