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

Reply via email to