Changeset: 86183e7d8e3b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=86183e7d8e3b
Modified Files:
monetdb5/extras/bwd/operations.c
Branch: bwd
Log Message:
* optimizing the projection for the full gpu-resident case as well
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
@@ -3,6 +3,8 @@
#include "monetdb_config.h"
#include "opt_statistics.h"
#include "algebra.h"
+#include <math.h>
+
#include "bwd.h"
@@ -149,7 +151,7 @@ str BWDLeftJoinApproximate(bat * res, ba
return MAL_SUCCEED;
};
-static inline int decompressIntValue(int i, int approximationbits, clTail*
compressedTail, const unsigned char* residuals, int residualI){
+static inline int decompressIntValue(const int i, const int approximationbits,
const clTail* compressedTail, const unsigned char* residuals, const int
residualI){
/* const int index = compressedHead->positions[i];
*/
const int residualBits = 32-approximationbits;
const unsigned int residualMask = (1 << residualBits)-1;
@@ -604,51 +606,56 @@ str BWDSemijoinRefine(int *res, int *lid
BAT* refinement;
if(BAThvoid(left) && ATOMstorage(BATttype(left)) == TYPE_int &&
BAThtype(right) == TYPE_oid){ // TODO: type specific
refinement = BATnew(TYPE_void, BATttype(left), right->batCount);
+
BATseqbase(refinement, oid_nil);
+
size_t bufferSize;
getPositionsColumn(batTailPositions(approximation), NULL,
&bufferSize);
clHead* supersetPositionsColumn =
getPositionsColumn(batTailPositions(approximation), malloc(bufferSize),
&bufferSize);
- getApproximateValuesColumn(batTailApproximation(approximation),
NULL, &bufferSize);
- clTail* supersetApproximateValuesColumn =
getApproximateValuesColumn(batTailApproximation(approximation),
malloc(bufferSize), &bufferSize);
+ unsigned char* filteredResiduals = NULL;
- unsigned char* filteredResiduals;
- size_t refinementCount = 0;
- if(supersetPositionsColumn){ // if the approximation is empty,
the memory objects are NULL
- int* refinementRegion = (int*) Tloc(refinement,
BUNfirst(refinement));
- const unsigned char* residuals = batTailResiduals(left);
- const unsigned int residualBytes =
Tsize(left)-approximationBits/8;
+ if(supersetPositionsColumn->count == BATcount(right)){ // the
approximation was correct, no refinement necessary
+ clEnqueueReadBuffer(getCommandQueue(),
batTailApproximation(approximation), CL_TRUE, sizeof(clTail),
BATcount(right)*sizeof(int), Tloc(refinement, BUNfirst(refinement)), 0, NULL,
NULL);
+ BATsetcount(refinement, supersetPositionsColumn->count);
+ } else {
- filteredResiduals =
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
- const size_t leftHMin = left->hseqbase, leftHMax =
left->hseqbase + BATcount(left);
+
getApproximateValuesColumn(batTailApproximation(approximation), NULL,
&bufferSize);
+ clTail* supersetApproximateValuesColumn =
getApproximateValuesColumn(batTailApproximation(approximation),
malloc(bufferSize), &bufferSize);
+
+ size_t refinementCount = 0;
+ if(supersetPositionsColumn){
+ { // if the approximation is empty, the memory
objects are NULL
+ int* refinementRegion = (int*)
Tloc(refinement, BUNfirst(refinement));
+ const unsigned char* residuals =
batTailResiduals(left);
+ const unsigned int residualBytes =
Tsize(left)-approximationBits/8;
+
+ filteredResiduals =
calloc((supersetPositionsColumn->count)*residualBytes + sizeof(size_t), 1);
+ const size_t leftHMin = left->hseqbase,
leftHMax = left->hseqbase + BATcount(left);
- int i,j;
- /* for ( i = 0; i < supersetPositionsColumn->count;
++i) { */
- /* if((supersetPositionsColumn->positions[i] >=
leftHMin) & (supersetPositionsColumn->positions[i] < leftHMax)){ */
- /* refinementRegion[refinementCount++] =
decompressIntValue(i, approximationBits, supersetApproximateValuesColumn,
residuals, supersetPositionsColumn->positions[i]); */
- /* } */
- /* } */
- for ( i = j = 0; j < BATcount(right); ++j) {
- while(supersetPositionsColumn->positions[i] !=
((oid*)right->H->heap.base)[j])
- i++;
- /* if((supersetPositionsColumn->positions[i] >=
leftHMin) & (supersetPositionsColumn->positions[i] < leftHMax)) */{
- refinementRegion[refinementCount++] =
decompressIntValue(i, approximationBits, supersetApproximateValuesColumn,
residuals, supersetPositionsColumn->positions[i]);
+ int i,j;
+ for ( i = j = 0; j < BATcount(right);
++j) {
+
while(supersetPositionsColumn->positions[i] != ((oid*)right->H->heap.base)[j])
+ i++;
+
refinementRegion[refinementCount++] = decompressIntValue(i, approximationBits,
supersetApproximateValuesColumn, residuals,
supersetPositionsColumn->positions[i]);
+ }
}
+ }else {
+ printf ("uh oh, %s ran into an unimplemented
case: no approximation provided\n", __func__);
}
- } else {
- printf ("uh oh, %s ran into an unimplemented case\n",
__func__);
- }
- BATsetcount(refinement, refinementCount);
+ BATsetcount(refinement, refinementCount);
+
+ }
+
BATseqbase(BATmirror(refinement), left->tseqbase);
refinement = VIEWcreate(BATmark(right, oid_nil),refinement);
+
+ 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;
- if(0) printf ("%s setting residuals of %d to %p\n", __func__,
refinement->batCacheid, getDecomposedBATSlot(refinement)->residuals);
- getDecomposedBATSlot(refinement)->approximationBits =
approximationBits;
-
-
+ getDecomposedBATSlot(refinement)->approximationBits =
batTailApproximationBits(left);
+ getDecomposedBATSlot(refinement)->tailOffsetBits =
batTailOffsetBits(left);
free(supersetPositionsColumn);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list