Changeset: a86ef1afc8ff for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a86ef1afc8ff Modified Files: gdk/gdk_aggr.c Branch: nilmask Log Message:
Implemented aggregates for unsigned.
diffs (truncated from 2230 to 300 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -704,6 +704,139 @@ dofsum(const void *restrict values, oid
} \
} while (0)
+#define AGGR_USUM(TYPE1, TYPE2)
\
+ do { \
+ TYPE1 x; \
+ const TYPE1 *restrict vals = (const TYPE1 *) values; \
+ if (ngrp == 1 && ci->tpe == cand_dense) { \
+ /* single group, no candidate list */ \
+ TYPE2 sum; \
+ *algo = "sum: no nils, no candidates, no groups"; \
+ sum = 0; \
+ TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
+ x = vals[ci->seq + i - seqb]; \
+ ADD_WITH_CHECK(x, sum, \
+ TYPE2, sum, \
+ GDK_##TYPE2##_max, \
+ goto overflow); \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ *sums = sum; \
+ } else if (ngrp == 1) { \
+ /* single group, with candidate list */ \
+ TYPE2 sum; \
+ *algo = "sum: no nils, with candidates, no groups"; \
+ sum = 0; \
+ TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
+ x = vals[canditer_next(ci) - seqb]; \
+ ADD_WITH_CHECK(x, sum, \
+ TYPE2, sum, \
+ GDK_##TYPE2##_max, \
+ goto overflow); \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ *sums = sum; \
+ } else if (ci->tpe == cand_dense) { \
+ /* multiple groups, no candidate list */ \
+ *algo = "sum: no nils, no candidates, with groups"; \
+ TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
+ if (gids == NULL || \
+ (gids[i] >= min && gids[i] <= max)) { \
+ gid = gids ? gids[i] - min : (oid) i; \
+ x = vals[ci->seq + i - seqb]; \
+ ADD_WITH_CHECK( \
+ x, \
+ sums[gid], \
+ TYPE2, \
+ sums[gid], \
+ GDK_##TYPE2##_max, \
+ goto overflow); \
+ } \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ } else { \
+ /* multiple groups, with candidate list */ \
+ *algo = "sum: no nils, with candidates, with groups"; \
+ TIMEOUT_LOOP(ci->ncand, qry_ctx) { \
+ i = canditer_next(ci) - seqb; \
+ if (gids == NULL || \
+ (gids[i] >= min && gids[i] <= max)) { \
+ gid = gids ? gids[i] - min : (oid) i; \
+ x = vals[i]; \
+ ADD_WITH_CHECK( \
+ x, \
+ sums[gid], \
+ TYPE2, \
+ sums[gid], \
+ GDK_##TYPE2##_max, \
+ goto overflow); \
+ } \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ } \
+ } while (0)
+
+#define AGGR_USUM_NOOVL(TYPE1, TYPE2) \
+ do { \
+ TYPE1 x; \
+ const TYPE1 *restrict vals = (const TYPE1 *) values; \
+ if (ngrp == 1 && ci->tpe == cand_dense) { \
+ /* single group, no nils, no candidate list */ \
+ TYPE2 sum; \
+ sum = 0; \
+ *algo = "sum: no nils, no candidates, no groups, no
nils, no overflow"; \
+ TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
+ sum += vals[ci->seq + i - seqb]; \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ *sums = sum; \
+ } else if (ngrp == 1) { \
+ /* single group, with candidate list */ \
+ TYPE2 sum; \
+ *algo = "sum: no nils, with candidates, no groups, no
overflow"; \
+ sum = 0; \
+ TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
+ x = vals[canditer_next(ci) - seqb]; \
+ sum += x; \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ *sums = sum; \
+ } else if (ci->tpe == cand_dense) { \
+ /* multiple groups, no candidate list */ \
+ *algo = "sum: no nils, no candidates, with groups, no
nils, no overflow"; \
+ TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
+ if (gids == NULL || \
+ (gids[i] >= min && gids[i] <= max)) { \
+ gid = gids ? gids[i] - min : (oid) i; \
+ x = vals[ci->seq + i - seqb]; \
+ sums[gid] += x; \
+ } \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ } else { \
+ /* multiple groups, with candidate list */ \
+ *algo = "sum: no nils, with candidates, with groups, no
overflow"; \
+ TIMEOUT_LOOP(ci->ncand, qry_ctx) { \
+ i = canditer_next(ci) - seqb; \
+ if (gids == NULL || \
+ (gids[i] >= min && gids[i] <= max)) { \
+ gid = gids ? gids[i] - min : (oid) i; \
+ x = vals[i]; \
+ sums[gid] += x; \
+ } \
+ } \
+ TIMEOUT_CHECK(qry_ctx, \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout,
qry_ctx)); \
+ } \
+ } while (0)
+
static BUN
dosum(const void *restrict values, bool nonil, oid seqb,
struct canditer *restrict ci,
@@ -734,9 +867,11 @@ dosum(const void *restrict values, bool
}
/* allocate bitmap for seen group ids */
- seen = GDKzalloc(((ngrp + 31) / 32) * sizeof(int));
- if (seen == NULL) {
- return BUN_NONE;
+ if (ATOMnilptr(tp2) != NULL) {
+ seen = GDKzalloc(((ngrp + 31) / 32) * sizeof(int));
+ if (seen == NULL) {
+ return BUN_NONE;
+ }
}
switch (tp2) {
@@ -751,6 +886,17 @@ dosum(const void *restrict values, bool
}
break;
}
+ case TYPE_ubte: {
+ ubte *restrict sums = (ubte *) results;
+ switch (tp1) {
+ case TYPE_ubte:
+ AGGR_USUM(ubte, ubte);
+ break;
+ default:
+ goto unsupported;
+ }
+ break;
+ }
case TYPE_sht: {
sht *restrict sums = (sht *) results;
switch (tp1) {
@@ -768,6 +914,23 @@ dosum(const void *restrict values, bool
}
break;
}
+ case TYPE_usht: {
+ usht *restrict sums = (usht *) results;
+ switch (tp1) {
+ case TYPE_ubte:
+ if (ci->ncand < ((BUN) 1 << ((sizeof(usht) -
sizeof(ubte)) << 3)))
+ AGGR_USUM_NOOVL(ubte, usht);
+ else
+ AGGR_USUM(ubte, usht);
+ break;
+ case TYPE_usht:
+ AGGR_USUM(usht, usht);
+ break;
+ default:
+ goto unsupported;
+ }
+ break;
+ }
case TYPE_int: {
int *restrict sums = (int *) results;
switch (tp1) {
@@ -791,6 +954,29 @@ dosum(const void *restrict values, bool
}
break;
}
+ case TYPE_uint: {
+ uint *restrict sums = (uint *) results;
+ switch (tp1) {
+ case TYPE_ubte:
+ if (ci->ncand < ((BUN) 1 << ((sizeof(uint) -
sizeof(ubte)) << 3)))
+ AGGR_USUM_NOOVL(ubte, uint);
+ else
+ AGGR_USUM(ubte, uint);
+ break;
+ case TYPE_usht:
+ if (ci->ncand < ((BUN) 1 << ((sizeof(uint) -
sizeof(usht)) << 3)))
+ AGGR_USUM_NOOVL(usht, uint);
+ else
+ AGGR_USUM(usht, uint);
+ break;
+ case TYPE_uint:
+ AGGR_USUM(uint, uint);
+ break;
+ default:
+ goto unsupported;
+ }
+ break;
+ }
case TYPE_lng: {
lng *restrict sums = (lng *) results;
switch (tp1) {
@@ -832,6 +1018,47 @@ dosum(const void *restrict values, bool
}
break;
}
+ case TYPE_ulng: {
+ ulng *restrict sums = (ulng *) results;
+ switch (tp1) {
+#if SIZEOF_BUN == 4
+ case TYPE_ubte:
+ AGGR_USUM_NOOVL(ubte, ulng);
+ break;
+ case TYPE_usht:
+ AGGR_USUM_NOOVL(usht, ulng);
+ break;
+ case TYPE_uint:
+ AGGR_USUM_NOOVL(uint, ulng);
+ break;
+#else
+ case TYPE_ubte:
+ if (ci->ncand < ((BUN) 1 << ((sizeof(ulng) -
sizeof(ubte)) << 3)))
+ AGGR_USUM_NOOVL(ubte, ulng);
+ else
+ AGGR_USUM(ubte, ulng);
+ break;
+ case TYPE_usht:
+ if (ci->ncand < ((BUN) 1 << ((sizeof(ulng) -
sizeof(usht)) << 3)))
+ AGGR_USUM_NOOVL(usht, ulng);
+ else
+ AGGR_USUM(usht, ulng);
+ break;
+ case TYPE_uint:
+ if (ci->ncand < ((BUN) 1 << ((sizeof(ulng) -
sizeof(uint)) << 3)))
+ AGGR_USUM_NOOVL(uint, ulng);
+ else
+ AGGR_USUM(uint, ulng);
+ break;
+#endif
+ case TYPE_ulng:
+ AGGR_USUM(ulng, ulng);
+ break;
+ default:
+ goto unsupported;
+ }
+ break;
+ }
#ifdef HAVE_HGE
case TYPE_hge: {
hge *sums = (hge *) results;
@@ -856,12 +1083,35 @@ dosum(const void *restrict values, bool
}
break;
}
+ case TYPE_uhge: {
+ uhge *sums = (uhge *) results;
+ switch (tp1) {
+ case TYPE_ubte:
+ AGGR_USUM_NOOVL(ubte, uhge);
+ break;
+ case TYPE_usht:
+ AGGR_USUM_NOOVL(usht, uhge);
+ break;
+ case TYPE_uint:
+ AGGR_USUM_NOOVL(uint, uhge);
+ break;
+ case TYPE_ulng:
+ AGGR_USUM_NOOVL(ulng, uhge);
+ break;
+ case TYPE_uhge:
+ AGGR_USUM(uhge, uhge);
+ break;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]
