Changeset: 8fe4dd86cfe2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8fe4dd86cfe2
Modified Files:
        monetdb5/extras/crackers/crackers_core_unordered.mx
Branch: holindex
Log Message:

Handle elements that do not "fit" in vectors after the merge phase.


diffs (170 lines):

diff --git a/monetdb5/extras/crackers/crackers_core_unordered.mx 
b/monetdb5/extras/crackers/crackers_core_unordered.mx
--- a/monetdb5/extras/crackers/crackers_core_unordered.mx
+++ b/monetdb5/extras/crackers/crackers_core_unordered.mx
@@ -923,9 +923,8 @@ static str CRKvectorized_x_@2_@1 (
        BUN last_left = first_left + ml - 1, first_right = last_right + 1 - mr;
        BUN valueCount = ( (ml && mr && last_left + 1 < first_right) ?  ml + mr 
: last_right - first_left + 1 );
        const BUN vectorCount = valueCount/vector_elements;
-       const BUN remaining_elements = valueCount % vector_elements;
-       BUN lowerReadCursor = first_left, upperReadCursor = last_right - 
remaining_elements + 1;
-       BUN lowerWriteCursor = first_left, upperWriteCursor = last_right - 
remaining_elements;
+       BUN lowerReadCursor = first_left, upperReadCursor = last_right + 1;
+       BUN lowerWriteCursor = first_left, upperWriteCursor = last_right;
        BUN vectorI = 0, vectorR = 3, skip, skip_left, skip_right;
        cursorDeltas deltas;
        BAT *localBuffer = BATnew(TYPE_oid, TYPE_@1, vector_elements*3);
@@ -933,12 +932,11 @@ static str CRKvectorized_x_@2_@1 (
        @1  *src_t = (@1 *) Tloc(buffer, BUNfirst(buffer));
        oid *src_h_local = (oid*) Hloc(localBuffer, BUNfirst(localBuffer));
        @1  *src_t_local = (@1 *) Tloc(localBuffer, BUNfirst(localBuffer));
-       first_right = last_right - remaining_elements + 1 - mr;
 
        assert(buffer || localBuffer);
        assert(pos_r);
-       //assert(valueCount%(2*vector_elements) == 0);
-       //assert(!(ml && mr && last_left + 1 < first_right) || 
(ml%(2*vector_elements) == 0 && mr%(2*vector_elements) == 0));
+       assert(valueCount%(2*vector_elements) == 0);
+       assert(!(ml && mr && last_left + 1 < first_right) || 
(ml%(2*vector_elements) == 0 && mr%(2*vector_elements) == 0));
 
         memcpy(src_h_local, src_h + first_left, sizeof(oid)*2*vector_elements);
         memcpy(src_h_local + 2*vector_elements, src_h + 
upperReadCursor-vector_elements, sizeof(oid)*2*vector_elements);
@@ -1046,52 +1044,6 @@ static str CRKvectorized_x_@2_@1 (
        assert (vectorR == vectorCount);
        //assert(lowerReadCursor == upperReadCursor || (lowerReadCursor == 
first_right && upperReadCursor == last_left + 1));
 
-       if(remaining_elements > 0)
-       {
-               BUN qualifying_elements = 0;
-               BUN lowerCursor = last_right - remaining_elements + 1, 
upperCursor = last_right;
-               oid *tmp_h = GDKmalloc(remaining_elements * sizeof(oid));
-               @1 *tmp_t = GDKmalloc(remaining_elements * sizeof(@1 ));
-
-               while (src_t[lowerCursor] @7 pivot)
-               {
-                       lowerCursor++;
-                       qualifying_elements++;
-               }
-               while (src_t[upperCursor] @8 pivot)
-                       upperCursor--;
-
-               while (lowerCursor < upperCursor) {
-                       if (src_t[lowerCursor] @8 pivot && src_t[upperCursor] 
@7 pivot) {
-                               @1 tmp = src_t[lowerCursor];
-                               oid tmp_oid = src_h[lowerCursor];
-                               src_t[lowerCursor] = src_t[upperCursor];
-                               src_t[upperCursor] = tmp;
-                               src_h[lowerCursor] = src_h[upperCursor];
-                               src_h[upperCursor] = tmp_oid;
-                               lowerCursor++;
-                               upperCursor--;
-                               qualifying_elements++;
-                       } else if (src_t[lowerCursor] @7 pivot) {
-                               lowerCursor++;
-                               qualifying_elements++;
-                       } else if (src_t[upperCursor] @8 pivot) {
-                               upperCursor--;
-                       }
-               }
-               if (lowerCursor == upperCursor && src_t[lowerCursor] @7 pivot)
-                       qualifying_elements += 1;
-
-               memcpy(tmp_h, src_h + lowerWriteCursor, 
sizeof(oid)*qualifying_elements);
-               memcpy(src_h + lowerWriteCursor, src_h + (last_right - 
remaining_elements + 1), sizeof(oid)*qualifying_elements);
-               memcpy(src_h + (last_right - remaining_elements + 1), tmp_h, 
sizeof(oid)*qualifying_elements);
-               memcpy(tmp_t, src_t + lowerWriteCursor, 
sizeof(@1)*qualifying_elements);
-               memcpy(src_t + lowerWriteCursor, src_t + (last_right - 
remaining_elements + 1), sizeof(@1)*qualifying_elements);
-               memcpy(src_t + (last_right - remaining_elements + 1), tmp_t, 
sizeof(@1)*qualifying_elements);
-               lowerWriteCursor = lowerWriteCursor + qualifying_elements;
-       }
-
-
        *pos_r = lowerWriteCursor;
 
        return MAL_SUCCEED;
@@ -1114,7 +1066,7 @@ cracking_MT_vectorized_crackThread_@2_@1
        return NULL;
 }
 
-static str CRKvectorized_MT_@2_@1 (const BAT *b, const BUN first, const BUN 
last, const @1 pivot, oid *pos, int nthreads, int alt, const @1 pivot_P, int 
vector_elements)
+static str CRKvectorized_MT_@2_@1 (const BAT *b, BUN first, BUN last, const @1 
pivot, oid *pos, int nthreads, int alt, const @1 pivot_P, int vector_elements)
 {
         BUN n = last - first + 1; /* total # tuples / values */
         BUN ml;                   /* # tuples / values in left slice */
@@ -1126,6 +1078,7 @@ static str CRKvectorized_MT_@2_@1 (const
         int i, j;
        oid *src_h = (oid*) Hloc(b, BUNfirst(b)), *tmp_h;
        @1  *src_t = (@1 *) Tloc(b, BUNfirst(b)), *tmp_t;
+       BUN remaining_elements = 0;
 
        /* adjust nthreads */
        if (nthreads == 0) {
@@ -1136,7 +1089,13 @@ static str CRKvectorized_MT_@2_@1 (const
                 /* more threads / smaller slices does not make sense */
                 nthreads = (int) (n / 1000) + 1;
         }
+
        mm = (n / nthreads);
+       remaining_elements = (mm % (2 * vector_elements)) * nthreads;
+       mm = (n - remaining_elements) / nthreads;
+       remaining_elements += ((n - remaining_elements) % nthreads);
+       last -= remaining_elements;
+       mm -= ((n - remaining_elements) % nthreads);
         if (alt == 1) {
                ml = 0;
                mr = 0;
@@ -1314,6 +1273,55 @@ static str CRKvectorized_MT_@2_@1 (const
         assert(f != BUN_NONE);
        assert((f == last + 1 && src_t[f-1] @7 pivot) || src_t[f]   @8 pivot);
        assert((f == first    && src_t[f]   @8 pivot) || src_t[f-1] @7 pivot);
+
+       if(remaining_elements > 0)
+       {
+               BUN qualifying_elements = 0;
+               BUN lowerCursor = last + 1, upperCursor = last + 
remaining_elements;
+               oid *tmp_head = GDKmalloc(remaining_elements * sizeof(oid));
+               @1 *tmp_tail = GDKmalloc(remaining_elements * sizeof(@1 ));
+
+               while (src_t[lowerCursor] @7 pivot)
+               {
+                       lowerCursor++;
+                       qualifying_elements++;
+               }
+               while (src_t[upperCursor] @8 pivot)
+                       upperCursor--;
+
+               while (lowerCursor < upperCursor) {
+                       if (src_t[lowerCursor] @8 pivot && src_t[upperCursor] 
@7 pivot) {
+                               @1 tmp = src_t[lowerCursor];
+                               oid tmp_oid = src_h[lowerCursor];
+                               src_t[lowerCursor] = src_t[upperCursor];
+                               src_t[upperCursor] = tmp;
+                               src_h[lowerCursor] = src_h[upperCursor];
+                               src_h[upperCursor] = tmp_oid;
+                               lowerCursor++;
+                               upperCursor--;
+                               qualifying_elements++;
+                       } else if (src_t[lowerCursor] @7 pivot) {
+                               lowerCursor++;
+                               qualifying_elements++;
+                       } else if (src_t[upperCursor] @8 pivot) {
+                               upperCursor--;
+                       }
+               }
+               if (lowerCursor == upperCursor && src_t[lowerCursor] @7 pivot)
+                       qualifying_elements += 1;
+               
+               memcpy(tmp_head, src_h + f, sizeof(oid)*qualifying_elements);
+               memcpy(src_h +  f, src_h + last + 1, 
sizeof(oid)*qualifying_elements);
+               memcpy(src_h + last + 1, tmp_head, 
sizeof(oid)*qualifying_elements);
+               memcpy(tmp_tail, src_t + f, sizeof(@1)*qualifying_elements);
+               memcpy(src_t + f, src_t + last + 1, 
sizeof(@1)*qualifying_elements);
+               memcpy(src_t + last + 1, tmp_tail, 
sizeof(@1)*qualifying_elements);                     
+               
+               f += qualifying_elements;
+               GDKfree(tmp_head);
+               GDKfree(tmp_tail);
+       }
+
         *pos = (BUN) (f == 0 ? 0 : f - 1);
 
        GDKfree(tmp_h);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to