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

Reply via email to