Changeset: 0071b48b9d94 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0071b48b9d94
Modified Files:
monetdb5/extras/crackers/crackers_core_unordered.mx
Branch: holindex
Log Message:
Remove the restriction: #elements perfectly divided by vector size.
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
@@ -170,6 +170,7 @@ typedef struct {
BUN m; /* size of half slice */
BUN ml; /* size of left slice */
BUN mr; /* size of right slice */
+ int vector_elements;
} c_Thread_t;
typedef struct {
@@ -917,13 +918,14 @@ static str CRKvectorized_x_@2_@1 (
BUN ml,
BUN mr,
BUN *pos_r, /*return position*/
- int vector_elements
+ int vector_elements /*size of vector*/
) {
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;
- BUN lowerReadCursor = first_left, upperReadCursor = last_right + 1;
- BUN lowerWriteCursor = first_left, upperWriteCursor = last_right;
+ const BUN remaining_elements = valueCount %
(vector_elements*sizeof(@1));
+ BUN lowerReadCursor = first_left, upperReadCursor = last_right -
remaining_elements + 1;
+ BUN lowerWriteCursor = first_left, upperWriteCursor = last_right -
remaining_elements;
BUN vectorI = 0, vectorR = 3, skip, skip_left, skip_right;
cursorDeltas deltas;
BAT *localBuffer = BATnew(TYPE_oid, TYPE_@1, vector_elements*3);
@@ -931,12 +933,12 @@ 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);
@@ -1044,6 +1046,52 @@ 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;
@@ -1057,10 +1105,9 @@ cracking_MT_vectorized_crackThread_@2_@1
c_Thread_t *arg = (c_Thread_t*) arg_p;
@1 mval = * (@1*) arg->mval;
BUN pos_r;
- int vector_elements = 1024;
/* call actual cracking routine for this slice */
- arg->msg = CRKvectorized_x_@2_@1 ( arg->b, mval, arg->first, arg->last,
arg->ml, arg->mr, &pos_r, vector_elements);
+ arg->msg = CRKvectorized_x_@2_@1 ( arg->b, mval, arg->first, arg->last,
arg->ml, arg->mr, &pos_r, arg->vector_elements);
arg->pos_r = pos_r;
pthread_exit(NULL);
@@ -1085,10 +1132,6 @@ static str CRKvectorized_MT_@2_@1 (const
/* automatic setting */
nthreads = GDKnr_threads;
}
- if ((BUN) nthreads > n / 1000) {
- /* more threads / smaller slices does not make sense */
- nthreads = (int) (n / 1000) + 1;
- }
mm = (n / nthreads);
if (alt == 1) {
ml = 0;
@@ -1132,6 +1175,7 @@ static str CRKvectorized_MT_@2_@1 (const
c_Thread_arg[i].last = (i < nthreads - 1) ? l :
last;
c_Thread_arg[i].ml = 0;
c_Thread_arg[i].mr = 0;
+ c_Thread_arg[i].vector_elements = vector_elements;
}
} else /* alt == 2 */ {
/* Alternative 2: nthreads-1 threads crack two disjoint
half-slices (from either end of the input piece), each - last thread cracks
center consecutive slice */
@@ -1145,6 +1189,7 @@ static str CRKvectorized_MT_@2_@1 (const
c_Thread_arg[i].last = l;
c_Thread_arg[i].ml = (i < nthreads - 1) ? ml : 0;
c_Thread_arg[i].mr = (i < nthreads - 1) ? mr : 0;
+ c_Thread_arg[i].vector_elements = vector_elements;
}
}
@@ -1263,8 +1308,8 @@ static str CRKvectorized_MT_@2_@1 (const
}
}
assert(f != BUN_NONE);
- assert((f == last + 1 && src_t[f-1] < pivot) || src_t[f] >= pivot);
- assert((f == first && src_t[f] >= pivot) || src_t[f-1] < 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);
GDKfree(tmp_h);
@@ -1279,6 +1324,7 @@ str
CRKcrackUnorderedZero_@2_@1( BAT *b, @1 mval, BUN first, BUN last, oid *pos,
int nthreads, int vector_elements){
str msg = MAL_SUCCEED;
int selectivity = 50;
+ int elements_per_vector = vector_elements/sizeof(@1);
assert(b);
assert(last >= first);
@@ -1312,11 +1358,11 @@ CRKcrackUnorderedZero_@2_@1( BAT *b, @1
} else
if (nthreads < 0) {
/* new multi-threaded crack code; Alternative 1 */
- msg = CRKvectorized_MT_@2_@1(b, first, last, mval, pos,
-nthreads, 1, selectivity, vector_elements);
+ msg = CRKvectorized_MT_@2_@1(b, first, last, mval, pos,
-nthreads, 1, selectivity, elements_per_vector);
} else
if (nthreads > 0) {
/* new multi-threaded crack code; Alternative 2 */
- msg = CRKvectorized_MT_@2_@1(b, first, last, mval, pos,
nthreads, 2, selectivity, vector_elements);
+ msg = CRKvectorized_MT_@2_@1(b, first, last, mval, pos,
nthreads, 2, selectivity, elements_per_vector);
}
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list