Changeset: bbfdeb161424 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bbfdeb161424
Modified Files:
monetdb5/extras/bwd/operations.c
monetdb5/extras/bwd/utilities.c
Branch: bwd
Log Message:
* working on the group refinement (transfer to cpu)
Unterschiede (175 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
@@ -45,7 +45,7 @@ static const int CLOCK_THREAD_CPUTIME_ID
#define die(msg, args...) throw (MAL, "bwd", msg, args);
-int getCount(cl_mem memoryObject){
+unsigned int getCount(cl_mem memoryObject){
cl_int err = 0;
int result;
err = clEnqueueReadBuffer(getCommandQueue(), memoryObject, CL_TRUE, 0,
sizeof(int), &result, 0, NULL, NULL);
@@ -98,6 +98,8 @@ clTail* getApproximateValuesColumn(cl_me
return buffer;
}
+
+
#ifndef CL_API_SUFFIX__VERSION_1_2
cl_int clEnqueueFillBuffer(cl_command_queue command_queue ,
cl_mem buffer ,
@@ -394,7 +396,10 @@ str BWDLeftJoinRefine(bat * res, bat * l
default:
throw (MAL, "bwd problem", "this type
(%d-byte) for %s is not implemented, %s:%d", ATOMsize(right->ttype), __func__,
__FILE__, __LINE__);
}
-#undef expansionLoop
+#undef expansionLoop
+ BATsetcount(refinement, left->batCount);
+ BATseqbase(refinement, 0);
+
} else {
oid* positionRegion = (oid*) Tloc(left,
BUNfirst(left));
size_t refinementCount = 0;
@@ -1189,11 +1194,12 @@ str BWDSelectNotNilApproximate(int *resu
return MAL_SUCCEED;
}
-str BWDSelectNotNilRefine(int *result, int *bid, int *approx){
- //TODO: implement me (easy)
- /* *result = *bid; */
- BBPincref(*result = *bid, 1);
- return ALGselectNotNil(result, bid);
+str BWDSelectNotNilRefine(int *ret, int *bid, int *approx){
+ BAT *left = BATdescriptor(*bid);
+ BAT* result = BATnew(BAThtype(left), BATttype(left), 0);
+ BBPkeepref(*ret = result->batCacheid);
+ BBPreleaseref(left->batCacheid);
+ return MAL_SUCCEED;
}
@@ -1457,9 +1463,10 @@ str BWDMulticolumnGroupApproximate(Clien
const unsigned int newIndex =
getNextFreeDecomposedBATSlotIndex();
DecomposedBATSlot* groupIDSlot =
getDecomposedBATSlotForIndex(newIndex);
BATsetprop(groupIDs, batRegistryIndex,
TYPE_int, (int[]){newIndex});
+ groupIDSlot->approximationBits = sizeof(int)*8;
- groupIDSlot->tailPositions =
bwdClCreateBuffer(getCLContext(), CL_MEM_READ_WRITE,
sizeof(int)*newTailDefinition.count+sizeof(clHead), NULL, &err);
- err = clEnqueueFillBuffer(getCommandQueue(),
groupIDSlot->tailPositions, zeroIntPattern, sizeof(int), 0, sizeof(clHead), 0,
NULL, NULL);
+ groupIDSlot->tailApproximation =
bwdClCreateBuffer(getCLContext(), CL_MEM_READ_WRITE,
sizeof(int)*newTailDefinition.count+sizeof(clHead), NULL, &err);
+ err = clEnqueueFillBuffer(getCommandQueue(),
groupIDSlot->tailApproximation, zeroIntPattern, sizeof(int), 0, sizeof(clHead),
0, NULL, NULL);
if(err) printf("#%s, clEnqueueFillBuffer:
%s;\n", __func__, clError(err));
}
@@ -1467,7 +1474,7 @@ str BWDMulticolumnGroupApproximate(Clien
const unsigned int newIndex =
getNextFreeDecomposedBATSlotIndex();
histogramSlot =
getDecomposedBATSlotForIndex(newIndex);
BATsetprop(histo, batRegistryIndex, TYPE_int,
(int[]){newIndex});
-
+ histogramSlot->approximationBits =
sizeof(int)*8;
{
histogramSlot->tailPositions =
bwdClCreateBuffer(getCLContext(), CL_MEM_READ_WRITE,
sizeof(int)*histogramSize+sizeof(clHead), NULL, &err);
histogramSlot->headApproximation =
histogramSlot->tailPositions;
@@ -1492,7 +1499,7 @@ str BWDMulticolumnGroupApproximate(Clien
for (i = 0; i < 3; ++i) {
if((err = clSetKernelArg(groupKernel,
i, sizeof(cl_mem), &((cl_mem[]){
-
batTailPositions(groupIDs),
+
batTailApproximation(groupIDs),
batHeadApproximation(histo),
batTailApproximation(histo)}[i]
))))
printf("#%s, clSetKernelArg(%d): %s;\n", __func__, i, clError(err));
@@ -1514,6 +1521,7 @@ str BWDMulticolumnGroupApproximate(Clien
int i;
cl_mem newHead =
createZeroHeadedCopy(batHeadApproximation(histo));
cl_mem newTail =
createZeroHeadedCopy(batTailApproximation(histo));
+ assert(getCount(newHead) == getCount(newTail));
for (i = 0; i < 4; ++i) {
if((err = clSetKernelArg(compactKernel,
i, sizeof(cl_mem), &((cl_mem[]){
batHeadApproximation(histo),
@@ -1531,6 +1539,7 @@ str BWDMulticolumnGroupApproximate(Clien
histogramSlot->tailPositions =
histogramSlot->headApproximation;
assert(histogramSlot->headApproximation);
assert(histogramSlot->tailPositions);
+ assert(getCount(histogramSlot->tailPositions)
== getCount(histogramSlot->tailApproximation));
}
BBPkeepref(*retbid = groupIDs->batCacheid);
@@ -1553,12 +1562,41 @@ str BWDGroupRefine(int *rethisto, int *r
}
BAT* materializeBATInHostMemory(BAT* input){
- return input;
+ unsigned int count = getCount(batTailApproximation(input));
+ BAT* result = BATnew(BAThtype(input), BATttype(input), count);
+ assert(batTailResidualBits(input) == 0);
+ switch(BAThtype(input)){
+ case TYPE_oid:{
+ register oid* outputRegion = (oid*) Tloc(result,
BUNfirst(result));
+ unsigned int i;
+
+ clHead* positionsColumn;
+ size_t bufferSize;
+ getPositionsColumn(batTailPositions(input), NULL, &bufferSize);
+ positionsColumn = getPositionsColumn(batTailPositions(input),
GDKmalloc(bufferSize), &bufferSize);
+ assert(count == positionsColumn->count);
+ for (i = 0; i < count; ++i)
+ outputRegion[i] = positionsColumn->positions[i];
+ break;
+ }
+ case TYPE_void:{
+ BATseqbase(result, 0);
+ break;
+ }
+ default:
+ printf("unsupported head type in materialization: %s, %s,
%s:%d", BATatoms[input->H->type].name, __func__, __FILE__, __LINE__);
+ abort();
+ }
+
+ BATsetcount(result, count);
+ return result;
}
+
+
str BWDMulticolumnGroupRefine(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci){
- int *retbid = (int*) getArgReference(stk,pci,0);
- int *rethisto = (int*) getArgReference(stk,pci,1);
+ int *rethisto = (int*) getArgReference(stk,pci,0);
+ int *retbid = (int*) getArgReference(stk,pci,1);
str result = MAL_SUCCEED;
int i;
BAT **inputs = (BAT**) GDKzalloc(sizeof(BAT*) * pci->argc);
@@ -1570,10 +1608,12 @@ str BWDMulticolumnGroupRefine(Client cnt
}
{
- 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);
+ BAT *approximationrethisto = BATdescriptor(*(int*)
getArgReference(stk,pci, pci->argc-2));
+ BAT *approximationretbid = BATdescriptor(*(int*)
getArgReference(stk,pci,pci->argc-1));
+ /* BBPincref(*retbid =
materializeBATInHostMemory(approximationretbid)->batCacheid, 1); */
+ /* BBPincref(*rethisto =
materializeBATInHostMemory(approximationrethisto)->batCacheid, 1); */
+ BBPkeepref(*retbid =
materializeBATInHostMemory(approximationretbid)->batCacheid);
+ BBPkeepref(*rethisto =
materializeBATInHostMemory(approximationrethisto)->batCacheid);
BBPreleaseref(*retbid);
BBPreleaseref(*rethisto);
}
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
@@ -271,7 +271,10 @@ int batTailOffsetValue(const BAT* subjec
size_t batTailResidualBits(const BAT* subject){
assert(ATOMsize(subject->ttype) > 0);
- return subject->T->width*8 - batTailApproximationBits(subject) -
batTailOffsetBits(subject);
+ if(BATttype(subject) == TYPE_oid) // we're using 32-bit oids on the GPU
+ return 32 - batTailApproximationBits(subject) -
batTailOffsetBits(subject);
+ else
+ return subject->T->width*8 - batTailApproximationBits(subject)
- batTailOffsetBits(subject);
}
const unsigned char* batTailResiduals(const BAT* subject){
PROPrec* rightTailApproximationProperty;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list