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

revised ad fixed multi-threaded cracking implementation

the best choices of some local code alternatives
(see "#if [01] /* option [12] */")
still need to be assessed experimentally


diffs (truncated from 598 to 300 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
@@ -154,7 +154,7 @@ str CRKcrackUnorderedThreeSideways_@3_@4
 #include "monetdb_config.h"
 #include "crackers.h"
 
-/*#define CRACK_MUTLI_THREAD_DEBUG*/
+//#define CRACK_MUTLI_THREAD_DEBUG
 
 /* argument struct for countThread & crackThread functions */
 typedef struct {
@@ -165,7 +165,7 @@ typedef struct {
        const void *mval;  /* pivot value */
        BUN first;         /* offset of first value in slice */
        BUN last;          /* offset of last value in slice */
-       BUN pos;           /* offset of pivot value */
+       BUN pos_r;         /* first(!) pos of right(!) piece */
        const char *msg;   /* error message */
        BUN m;             /* size of half slice */
 } c_Thread_t;
@@ -297,15 +297,210 @@ CRKcrackUnorderedZero_@2_@1_ST( BAT *b, 
 
 /* revised single-threaded crack code */
 static str
+CRKcrackUnorderedZero_@2_@1_STxx ( const BAT *b, const @1 mval, const BUN 
first, const BUN last, const BUN m, BUN *pos_r
+ #ifdef CRACK_MUTLI_THREAD_DEBUG
+                                 , const char *secs
+ #endif
+                                )
+{
+       BUN p = first, q = last, pp = p + m - 1, qq = q + 1 - m;
+       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 (m && pp + 1 < qq) {
+               /* crack disjoint left- & right-half of piece / slice */
+               while (p <= pp && q >= qq) {
+#if 1 /* option 1 */
+                       /* 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 */
+                       }
+#endif
+#if 0 /* option 2 */
+                       /* skip over smaller value from beginning */
+                       if (src_t[p] @7 mval) {
+                               p++;
+                               if (p > pp) {
+                                       /* exhausted left half, skip to right 
one */
+                                       p = qq;
+                                       break; /* not really required */
+                               }
+                       }
+#endif
+                       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 */
+#if 1 /* option 1 */
+                                       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;
+#endif
+#if 0 /* option 2 */
+                                       oid h;
+                                       @1  t;
+                                       h = src_h[p];
+                                       src_h[p] = src_h[q];
+                                       src_h[q] = h;
+                                       t = src_t[p];
+                                       src_t[p] = src_t[q];
+                                       src_t[q] = t;
+#endif
+                                       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 (!(m && pp + 1 < qq) || p >= qq || q <= pp) {
+               while (p < q) {
+#if 1 /* option 1 */
+                       /* skip over smaller values from beginning */
+                       while (p < q && src_t[p] @7 mval) {
+                               p++;
+                       }
+#endif
+#if 0 /* option 2 */
+                       /* skip over smaller value from beginning */
+                       if (src_t[p] @7 mval) {
+                               p++;
+                       } else 
+#endif
+                       {
+                               /* skip over larger values from end */
+                               while (p < q && src_t[q] @8 mval) {
+                                       q--;
+                               }
+                               if (p < q)
+                               {
+                                       /* swap values */
+#if 1 /* option 1 */
+                                       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;
+#endif
+#if 0 /* option 2 */
+                                       oid h;
+                                       @1  t;
+                                       h = src_h[p];
+                                       src_h[p] = src_h[q];
+                                       src_h[q] = h;
+                                       t = src_t[p];
+                                       src_t[p] = src_t[q];
+                                       src_t[q] = t;
+#endif
+                                       p++;
+                                       q--;
+                               }
+                       }
+               }
+       }
+
+       /* return pivot position, i.e., first(!) pos in right(!) piece */
+       assert(p >= first && p <= last);
+       if (m && 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 || (m && pp + 1 < qq && p == qq && src_t[pp] @7 mval) 
|| (!(m && 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 (m && pp + 1 < qq && q == pp + 1)
+                       q = qq;
+               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 (m && 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
  #ifdef CRACK_MUTLI_THREAD_DEBUG
                                  , const char *secs
  #endif
                                 )
 {
-       BUN p = first, q = last, pp = p + m - 1, qq = q - m + 1;
-       oid *src_h;
-       @1  *src_t;
+       str msg;
+       BUN pos_r;
+
  #ifdef CRACK_MUTLI_THREAD_DEBUG
        lng t_0, t_1;
 
@@ -315,66 +510,16 @@ CRKcrackUnorderedZero_@2_@1_STx ( const 
        t_0 = GDKusec();
  #endif
 
-       /* input (source) arrays */
-       src_h = (oid*) Hloc(b, BUNfirst(b));
-       src_t = (@1 *) Tloc(b, BUNfirst(b));
+       assert(b);
+       assert(pos);
+       assert(m == 0 || first + m - 1 + 1 == last + 1 - m);
 
-       if (m && pp < qq - 1) {
-               /* 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 /*@5_@3(&src_t[p], 
&mval, @6@1)*/)
-                               p++;
-                       /* skip over larger values from end */
-                       while (q >= qq && src_t[q] @8 mval /*@5_@4(&src_t[q], 
&mval, @6@1)*/)
-                               q--;
-                       if (p <= pp && q >= qq) {
-                               /* 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 right half, skip to left one */
-                       q = pp;
-               }
-       }
-
-       /* crack (remaining) consequtive piece / slice */
-       while (p < q) {
-               /* skip over smaller values from beginning */
-               while (p < q && src_t[p] @7 mval /*@5_@3(&src_t[p], &mval, 
@6@1)*/)
-                       p++;
-               /* skip over larger values from end */
-               while (p < q && src_t[q] @8 mval /*@5_@4(&src_t[q], &mval, 
@6@1)*/)
-                       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 */
-       while (p <= last && src_t[p] @7 mval /*@5_@3(&src_t[p], &mval, @6@1)*/)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to