Changeset: 577a5c7b702f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=577a5c7b702f
Modified Files:
monetdb5/extras/bwd/operations.c
monetdb5/extras/bwd/utilities.c
monetdb5/extras/bwd/utilities.h
Branch: bwd
Log Message:
* returning correct results for a simple select query now
Unterschiede (117 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
@@ -116,6 +116,13 @@ typedef union {
} longIndexed;
} indexedValue;
+char* approximateOperation(char* exactOperation){
+ if (exactOperation[1] == '\0')
+ return exactOperation[0] == '<' ? "<=": ">=";
+ else
+ return exactOperation;
+}
+
str BWDThetauselectApproximate(bat *res, bat *bid, ptr val, str *OP) {
BAT* data = BATdescriptor(*bid);
assert(BATttype(data) == TYPE_int); // type specific
@@ -157,7 +164,7 @@ str BWDThetauselectApproximate(bat *res,
" }"
"}";
char* sourceCode = malloc(16384);
- snprintf(sourceCode, 16384, sourceCodeTemplate,
typeNames[BATttype(data)], *OP, batTailApproximationBits(data)/8,
32-batTailApproximationBits(data));
+ snprintf(sourceCode, 16384, sourceCodeTemplate,
typeNames[BATttype(data)], approximateOperation(*OP),
batTailApproximationBits(data)/8, 32-batTailApproximationBits(data));
THRprintf(GDKout, "#%s, sourceCode: %s;\n", __func__,
sourceCode);
cl_int err;
cl_program program = clCreateProgramWithSource(getCLContext(),
1, (const char*[]){sourceCode}, (size_t[]){strlen(sourceCode)}, &err);
@@ -177,7 +184,7 @@ str BWDThetauselectApproximate(bat *res,
if(err) THRprintf(GDKout, "#%s, clCreateKernel: %s;\n",
__func__, clError(err));
err = clSetKernelArg(selectKernel, 0, sizeof(cl_mem),
(cl_mem[]){batTailApproximation(result)}); if (err) THRprintf(GDKout, "#%s,
clSetKernelArg(%d): %s;\n", __func__, 0, clError(err));
err = clSetKernelArg(selectKernel, 1, sizeof(cl_mem),
(cl_mem[]){batTailApproximation(data)}); if (err) THRprintf(GDKout, "#%s,
clSetKernelArg(%d): %s;\n", __func__, 1, clError(err));
- err = clSetKernelArg(selectKernel, 2, sizeof(int), val); if
(err) THRprintf(GDKout, "#%s, clSetKernelArg(%d): %s;\n", __func__, 2,
clError(err));
+ err = clSetKernelArg(selectKernel, 2, sizeof(int),
(int[]){((*(int*)val)>>batTailResidualBits(data))<<batTailResidualBits(data)});
if (err) THRprintf(GDKout, "#%s, clSetKernelArg(%d): %s;\n", __func__, 2,
clError(err)); // type specific
/* cl_mem outputCursor; */
/* { */
@@ -217,21 +224,35 @@ str BWDThetauselectRefine(bat *res, bat
int* resultRegion = (int*) Tloc(result, BUNfirst(result)); // type
specific
oid* positionRegion = (oid*) Hloc(result, BUNfirst(result)); // type
specific
size_t candidateCount = resultClBAT->count;
+ /* const register unsigned int residualBits = 32-approximationBits; */
+ const unsigned int approximationMask = ~((1 << (32 -
batTailApproximationBits(approximation)))-1);
+ const unsigned char* residuals = batTailResiduals(data);
+ const unsigned int residualMask = (1 << batTailResidualBits(data))-1;
+ const unsigned int residualBytes = batTailResidualBits(data)/8;
int i = 0, j = 0;
- /* const register unsigned int residualBits = 32-approximationBits; */
- const register unsigned int approximationMask = ~((1 << (32 -
batTailApproximationBits(approximation)))-1);
- while(i < candidateCount) {
- const int offset = (clDeviceAddressBytes() +
batTailApproximationBits(approximation)/8)*i++;
- /* printf ("offset: %d\n", offset); */
- const int index = *(int*)&resultClBAT->elements[offset]; //
- const int compressedValue =
*(int*)&(resultClBAT->elements[clDeviceAddressBytes()+offset]);
- /* const int bm = ~((int)255); */
- positionRegion[j] = index;
- resultRegion[j++] = compressedValue << (32 -
batTailApproximationBits(approximation));
- printf ("compressed value: %d, index: %d, value: %d\n",
compressedValue, index, resultRegion[j-1]);
+#define refineLoop(comparator) while(i < candidateCount) {
\
+ const int offset = (clDeviceAddressBytes() +
batTailApproximationBits(approximation)/8)*i++; \
+ const int index = *(int*)&resultClBAT->elements[offset];
\
+ const int compressedValue =
*(int*)&(resultClBAT->elements[clDeviceAddressBytes()+offset]); \
+ const int deCompressedValue = (compressedValue <<
batTailResidualBits(approximation)) + (*(int*)&residuals[index*residualBytes] &
residualMask); \
+ if(deCompressedValue comparator *(int*)val) {
\
+ positionRegion[j] = index; \
+ resultRegion[j++] = deCompressedValue; \
+ printf ("compressed value: %d, index: %d, value: %d\n",
compressedValue, index, resultRegion[j-1]); \
+ }\
+}
+
+ switch (*OP[0]){
+ case '<':
+ refineLoop(<);
+ case '>':
+ refineLoop(>);
+ case '=':
+ refineLoop(==);
}
- BATsetcount(result, resultClBAT->count);
+#undef refineLoop
+ BATsetcount(result, j);
free(resultClBAT);
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
@@ -139,6 +139,9 @@ const size_t batTailApproximationBits(co
return
bwdRegistry[rightTailApproximationProperty->v.val.ival].approximationBits;
}
+const size_t batTailResidualBits(const BAT* subject){
+ return ATOMsize(subject->ttype)*8 - batTailApproximationBits(subject);
+}
const unsigned char* batTailResiduals(const BAT* subject){
PROPrec* rightTailApproximationProperty;
if(!(rightTailApproximationProperty = BATgetprop(subject,
batRegistryIndex))){
@@ -177,7 +180,8 @@ const unsigned int decomposeIntArray(con
const register unsigned int residualMask = (1 << residualBits)-1;
int i;
for (i = 0; i < size; ++i){
- *((unsigned int*)(slot->residuals + i*residualBytes)) |=
((subject[i]&residualMask)<<approximationBits);
+ *((unsigned int*)(slot->residuals + i*residualBytes)) |=
(subject[i]&residualMask);
+ /* *((unsigned int*)(slot->residuals + i*residualBytes)) |=
((subject[i]&residualMask)<<approximationBits); */
*((unsigned int*)(approximation + i*approximationBytes)) |=
(subject[i] >> residualBits);
}
{
diff --git a/monetdb5/extras/bwd/utilities.h b/monetdb5/extras/bwd/utilities.h
--- a/monetdb5/extras/bwd/utilities.h
+++ b/monetdb5/extras/bwd/utilities.h
@@ -17,6 +17,7 @@ const unsigned int getNextFreeDecomposed
const char batTailIsDecomposed(const BAT*);
const cl_mem batTailApproximation(const BAT*);
const size_t batTailApproximationBits(const BAT*);
+const size_t batTailResidualBits(const BAT* subject);
const unsigned char* batTailResiduals(const BAT*);
const unsigned int decomposeIntArray(const int* subject, const size_t size,
const size_t approximationBits);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list