From bd64e8bcd29ea759c8037ec1f2c3324da8a8b236 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sun, 2 Jun 2024 16:01:46 -0400 Subject: [PATCH] =?UTF-8?q?Faster=20boolean=20+`=CB=98=20for=20short=20row?= =?UTF-8?q?s=20based=20on=20flattened=20prefix=20sum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/scan.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/builtins/scan.c b/src/builtins/scan.c index a059c387..81d9cafe 100644 --- a/src/builtins/scan.c +++ b/src/builtins/scan.c @@ -343,6 +343,25 @@ B scan_rows_bit(Md1D* fd, B x) { else si_scan_rows_or (xp, rp, n, m); decG(x); return r; } + if (rtid==n_add && SH(x)[1]<128) { + usz ia = IA(x); usz m = SH(x)[1]; + usz bl = 128; // block size + i8 buf[bl]; i8 c = 0; + u64* xp = bitarr_ptr(x); + i8* rp; B r = m_i8arrc(&rp, x); + for (usz i = 0, j = m; i < ia; i += bl) { + usz len = ia - i; if (len > bl) len = bl; + usz e = i + len; + si_bcs8(xp + i/64, buf, len); + memset(rp+i, -c, len); + i8* bi = buf-i; + assert(j > i); for (; j < e; j += m) rp[j] = bi[j-1]; + si_scan_max_init_i8(rp+i, rp+i, len, I8_MIN); + for (usz k = i; k < e; k++) rp[k] = bi[k] - rp[k]; + if (j == e) { j += m; c = 0; } else c = rp[e-1]; + } + decG(x); return r; + } #endif return bi_N; }