Changeset: fc1bd042d03e for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fc1bd042d03e Modified Files: gdk/gdk_imprints.c Branch: default Log Message:
imprints: simplified IMPS_CREATE() loop
simpler C code appaers to yields more efficient machine code
diffs (152 lines):
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -142,82 +142,61 @@ do {
\
uint##B##_t *restrict im = (uint##B##_t *) imps; \
const TYPE *restrict col = (TYPE *) Tloc(b, b->batFirst); \
const TYPE *restrict bins = (TYPE *) inbins; \
- TYPE nil = TYPE##_nil; \
- prvmask = mask = 0; \
- new = (IMPS_PAGE/sizeof(TYPE))-1; \
- for (i = 0; i < b->batCount; i++) { \
- if (!(i&new) && i>0) { \
- /* same mask as previous and enough count to add */ \
- if ((prvmask == mask) && \
- (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
- /* not a repeat header */ \
- if (!dict[dcnt-1].repeat) { \
- /* if compressed */ \
- if (dict[dcnt-1].cnt > 1) { \
- /* uncompress last */ \
- dict[dcnt-1].cnt--; \
- dcnt++; /* new header */ \
- dict[dcnt-1].cnt = 1; \
- } \
- /* set repeat */ \
- dict[dcnt-1].repeat = 1; \
+ const TYPE nil = TYPE##_nil; \
+ const BUN page = IMPS_PAGE / sizeof(TYPE); \
+ prvmask = 0; \
+ for (i = 0; i < b->batCount; ) { \
+ const BUN lim = MIN(i + page, b->batCount); \
+ /* new mask */ \
+ mask = 0; \
+ /* build mask for all BUNs in one PAGE */ \
+ for ( ; i < lim; i++) { \
+ register const TYPE val = col[i]; \
+ GETBIN##B(bin,val); \
+ mask = IMPSsetBit(B,mask,bin); \
+ if (val != nil) { /* do not count nils */ \
+ if (!cnt_bins[bin]++) { \
+ min_bins[bin] = max_bins[bin] = i;\
+ } else { \
+ if (val < col[min_bins[bin]]) \
+ min_bins[bin] = i; \
+ if (val > col[max_bins[bin]]) \
+ max_bins[bin] = i; \
} \
- /* increase cnt */ \
- dict[dcnt-1].cnt++; \
- } else { /* new mask (or run out of header count) */ \
- prvmask=mask; \
- im[icnt] = mask; \
- icnt++; \
- if ((dcnt > 0) && !(dict[dcnt-1].repeat) && \
- (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
- dict[dcnt-1].cnt++; \
- } else { \
+ } \
+ } \
+ /* same mask as previous and enough count to add */ \
+ if ((prvmask == mask) && (dcnt > 0) && \
+ (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
+ /* not a repeat header */ \
+ if (!dict[dcnt-1].repeat) { \
+ /* if compressed */ \
+ if (dict[dcnt-1].cnt > 1) { \
+ /* uncompress last */ \
+ dict[dcnt-1].cnt--; \
+ /* new header */ \
dict[dcnt].cnt = 1; \
- dict[dcnt].repeat = 0; \
dict[dcnt].flags = 0; \
dcnt++; \
} \
+ /* set repeat */ \
+ dict[dcnt-1].repeat = 1; \
} \
- /* new mask */ \
- mask = 0; \
- } \
- GETBIN##B(bin,col[i]); \
- mask = IMPSsetBit(B,mask,bin); \
- if (col[i] != nil) { /* do not count nils */ \
- if (!cnt_bins[bin]++) { \
- min_bins[bin] = max_bins[bin] = i; \
+ /* increase cnt */ \
+ dict[dcnt-1].cnt++; \
+ } else { /* new mask (or run out of header count) */ \
+ prvmask=mask; \
+ im[icnt] = mask; \
+ icnt++; \
+ if ((dcnt > 0) && !(dict[dcnt-1].repeat) && \
+ (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
+ dict[dcnt-1].cnt++; \
} else { \
- if (col[i] < col[min_bins[bin]]) \
- min_bins[bin] = i; \
- if (col[i] > col[max_bins[bin]]) \
- max_bins[bin] = i; \
- } \
- } \
- } \
- /* one last left */ \
- if (prvmask == mask && dcnt > 0 && \
- (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
- if (!dict[dcnt-1].repeat) { \
- if (dict[dcnt-1].cnt > 1) { \
- dict[dcnt-1].cnt--; \
dict[dcnt].cnt = 1; \
+ dict[dcnt].repeat = 0; \
dict[dcnt].flags = 0; \
dcnt++; \
} \
- dict[dcnt-1].repeat = 1; \
- } \
- dict[dcnt-1].cnt ++; \
- } else { \
- im[icnt] = mask; \
- icnt++; \
- if ((dcnt > 0) && !(dict[dcnt-1].repeat) && \
- (dict[dcnt-1].cnt < (IMPS_MAX_CNT-1))) { \
- dict[dcnt-1].cnt++; \
- } else { \
- dict[dcnt].cnt = 1; \
- dict[dcnt].repeat = 0; \
- dict[dcnt].flags = 0; \
- dcnt++; \
} \
} \
} while (0)
@@ -227,7 +206,7 @@ imprints_create(BAT *b, void *inbins, BU
void *imps, BUN *impcnt, cchdc_t *dict, BUN *dictcnt)
{
BUN i;
- BUN dcnt, icnt, new;
+ BUN dcnt, icnt;
BUN *restrict min_bins = stats;
BUN *restrict max_bins = min_bins + 64;
BUN *restrict cnt_bins = max_bins + 64;
@@ -628,7 +607,11 @@ BATimprints(BAT *b)
return GDK_SUCCEED;
}
-#define getbin(TYPE,B) GETBIN##B(ret, *(TYPE *)v);
+#define getbin(TYPE,B) \
+do { \
+ register const TYPE val = * (TYPE *) v; \
+ GETBIN##B(ret,val); \
+} while (0)
int
IMPSgetbin(int tpe, bte bits, const char *restrict inbins, const void
*restrict v)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
