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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org