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

If the number of elements assigned to each thread is small, do naive cracking 
instead of vectorized.


diffs (202 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
@@ -500,6 +500,156 @@ CRKcrackUnorderedZero_@2_@1_STxx ( const
        return MAL_SUCCEED;
 }
 
+/* revised single-threaded crack code */
+static str
+CRKcrackUnorderedZero_@2_@1_STxxx ( const BAT *b, const @1 mval, const BUN 
first, const BUN last, const BUN ml, const BUN mr, BUN *pos_r
+ #ifdef CRACK_MUTLI_THREAD_DEBUG
+                                 , const char *secs
+ #endif
+                                )
+{
+       BUN p = first, q = last, pp = p + ml - 1, qq = q + 1 - mr;
+       oid *src_h;
+       @1  *src_t;
+ #ifdef CRACK_MUTLI_THREAD_DEBUG
+       lng t_0, t_1;
+
+       fprintf(stderr,
+               "CRKcrackUnorderedZero_@2_@1_STxx ( %d, "LLFMT", "BUNFMT", 
"BUNFMT", "BUNFMT", "BUNFMT", "BUNFMT" ) ...\n",
+               b->batCacheid, (lng) mval, first, pp, qq, last, m);
+       t_0 = GDKusec();
+ #endif
+
+       assert(b);
+       assert(pos_r);
+
+       /* input (source) arrays */
+       src_h = (oid*) Hloc(b, BUNfirst(b));
+       src_t = (@1 *) Tloc(b, BUNfirst(b));
+
+       if (ml && mr && pp + 1 < qq) {
+               /* crack disjoint left- & right-half of piece / slice */
+               while (p <= pp && q >= qq) {
+                       /* skip over smaller values from beginning */
+                       while (p <= pp && src_t[p] @7 mval)
+                               p++;
+                       if (p > pp) {
+                               /* exhausted left half, skip to right one */
+                               p = qq;
+                               break; /* not really required */
+                       }
+                       else {
+                               /* skip over larger values from end */
+                               while (q >= qq && src_t[q] @8 mval)
+                                       q--;
+                               if (q < qq) {
+                                       /* exhausted right half, skip to left 
one */
+                                       q = pp;
+                                       break; /* not really required */
+                               } else {
+                                       /* swap values */
+                                       const oid h = src_h[p];
+                                       const @1  t = src_t[p];
+                                       src_h[p] = src_h[q];
+                                       src_t[p] = src_t[q];
+                                       src_h[q] = h;
+                                       src_t[q] = t;
+                                       p++;
+                                       q--;
+                                       if (p > pp) {
+                                               /* exhausted left half, skip to 
right one */
+                                               p = qq;
+                                       }
+                                       if (q < qq) {
+                                               /* exhausted left half, skip to 
right one */
+                                               q = pp;
+                                       }
+                                       if (p > pp || q < qq) {
+                                               break; /* not really required */
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /* crack (remaining) consequtive piece / slice */
+       if (!(ml && mr && pp + 1 < qq) || p >= qq || q <= pp) {
+               while (p < q) {
+                       /* skip over smaller values from beginning */
+                       while (p < q && src_t[p] @7 mval) {
+                               p++;
+                       }
+                       /* skip over larger values from end */
+                       while (p < q && src_t[q] @8 mval) {
+                               q--;
+                       }
+                       if (p < q)
+                       {
+                       /* swap values */
+                               const oid h = src_h[p];
+                               const @1  t = src_t[p];
+                               src_h[p] = src_h[q];
+                               src_t[p] = src_t[q];
+                               src_h[q] = h;
+                               src_t[q] = t;
+                               p++;
+                               q--;
+                       }
+               }
+       }
+
+       /* return pivot position, i.e., first(!) pos in right(!) piece */
+       assert(p >= first && p <= last);
+       if (ml && mr && pp + 1 < qq) {
+               if (p <= pp + 1) {
+                       assert(p == first || src_t[p-1] @7 mval);
+                       while (p <= pp && src_t[p] @7 mval)
+                               p++;
+                       if (p == pp + 1)
+                               p = qq;
+               }
+               if (p >= qq) {
+                       assert((p == qq && src_t[pp] @7 mval) || (p > qq && 
src_t[p-1] @7 mval));
+                       while (p <= last && src_t[p] @7 mval)
+                               p++;
+               }
+       } else {
+               assert(p == first || src_t[p-1] @7 mval);
+               while (p <= last && src_t[p] @7 mval)
+                       p++;
+       }
+
+       assert(p >= first && p <= last + 1);
+       assert(p == first || (ml && mr && pp + 1 < qq && p == qq && src_t[pp] 
@7 mval) || (!(ml && mr && pp + 1 < qq && p == qq) && src_t[p-1] @7 mval));
+       assert(p == last + 1 || src_t[p] @8 mval);
+#ifndef NDEBUG
+       for (q = first; q < p; q++) {
+               if (ml && mr && pp + 1 < qq && q == pp + 1) {
+                       q = qq;
+                       if (q >= p)
+                               break;
+               }
+               if (!(src_t[q] @7 mval))
+                       fprintf(stderr,"a "BUNFMT": %d !@7 
%d\n",q,(int)src_t[q],(int)mval);
+       }
+       for (q = p; q <= last; q++) {
+               if (ml && mr && pp + 1 < qq && q == pp + 1)
+                       q = qq;
+               if (!(src_t[q] @8 mval))
+                       fprintf(stderr,"b "BUNFMT": %d !@8 
%d\n",q,(int)src_t[q],(int)mval);
+       }
+#endif
+       *pos_r = p;
+
+ #ifdef CRACK_MUTLI_THREAD_DEBUG
+       t_1 = GDKusec();
+       fprintf(stderr,
+               "CRKcrackUnorderedZero_@2_@1_STxx ( %d, "LLFMT", "BUNFMT", 
"BUNFMT", "BUNFMT", "BUNFMT", "BUNFMT" ) -> "BUNFMT" : %.6f %s\n",
+               b->batCacheid, (lng) mval, first, pp, qq, last, m, *pos_r, 
(dbl) (t_1 - t_0) / 1000000.0, secs);
+ #endif
+
+       return MAL_SUCCEED;
+}
 
 static str
 CRKcrackUnorderedZero_@2_@1_STx ( const BAT *b, const @1 mval, const BUN 
first, const BUN last, const BUN m, oid *pos
@@ -938,6 +1088,12 @@ static str CRKvectorized_x_@2_@1 (
        assert(valueCount%(2*vector_elements) == 0);
        assert(!(ml && mr && last_left + 1 < first_right) || 
(ml%(2*vector_elements) == 0 && mr%(2*vector_elements) == 0));
 
+       if(2*vectorR > vectorCount)
+       {
+               CRKcrackUnorderedZero_@2_@1_STxxx (buffer, pivot, first_left, 
last_right, ml, mr, pos_r);
+               return MAL_SUCCEED;
+       }
+
         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);
         memcpy(src_t_local, src_t + first_left, sizeof(@1)*2*vector_elements);
@@ -946,7 +1102,7 @@ static str CRKvectorized_x_@2_@1 (
        lowerReadCursor += 2*vector_elements;
        upperReadCursor -= vector_elements;
 
-
+       fprintf(stderr, "vectorR=%d, vectorCount=%d\n",(int)vectorR, 
(int)vectorCount);
 
        if (ml && mr && last_left + 1 < first_right) {
                /* we have two disjoint half-pieces */
@@ -1041,6 +1197,8 @@ static str CRKvectorized_x_@2_@1 (
                        vectorR++;
                }
        }
+
+       fprintf(stderr, "vectorR=%d, vectorCount=%d\n",(int)vectorR, 
(int)vectorCount);
        assert (vectorR == vectorCount);
        //assert(lowerReadCursor == upperReadCursor || (lowerReadCursor == 
first_right && upperReadCursor == last_left + 1));
 
@@ -1327,8 +1485,8 @@ 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);
+       //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);
 
         *pos = (BUN) (f == 0 ? 0 : f - 1);
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to