From 4b35acb82b71589b39cbd654814c4bbf4e46fb3d Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 4 Mar 2023 14:24:56 -0500 Subject: [PATCH 1/3] Transpose-based fold-cells implementation --- src/builtins/fold.c | 34 ++++++++++++++++++++++++++++++++++ src/builtins/md1.c | 8 +++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/builtins/fold.c b/src/builtins/fold.c index 44056167..72b43b1e 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -13,6 +13,7 @@ #include "../core.h" #include "../builtins.h" +#include "../utils/calls.h" #if SINGELI_X86_64 #define SINGELI_FILE fold @@ -319,3 +320,36 @@ u64 usum(B x) { // doesn't consume; will error on non-integers, or elements <0, overflow: thrM("Sum too big"); neg: thrM("Didn't expect negative integer"); } + +// Arithmetic fold/insert on rows of flat rank-2 array x +B insert_c1(Md1D*, B); +B transp_c1(B, B); +B join_c2(B, B, B); +B fold_rows(Md1D* fd, B x) { + assert(isArr(x) && RNK(x)==2); + // Target block size trying to avoid power-of-two lengths, from: + // {๐•ฉ/หœโŒŠยดโŠธ= +หห˜ +หยฌโˆจ`2|>โŒŠโˆ˜รทโŸœ2โŸ(โ†•12) โŒŠ0.5+32รทหœ๐•ฉรทโŒœ1+โ†•64} +โŸœโ†•2โ‹†16 + u64 block = (116053*8) >> arrTypeBitsLog(TY(x)); + if (TI(x,elType)==el_bit || IA(x)/2 <= block) { + x = C1(transp, x); + return insert_c1(fd, x); + } else { + usz *sh = SH(x); usz n = sh[0]; usz m = sh[1]; + usz b = (block + m - 1) / m; // Normal block length + usz b_max = b + b/4; // Last block max length + B r = bi_N; + BSS2A slice = TI(x,slice); + for (usz i=0, im=0; i b_max) { incG(x); l = b; } + usz sia = l * m; + Arr* sl = slice(x, im, sia); + usz* ssh = arr_shAlloc(sl, 2); + ssh[0] = l; + ssh[1] = m; + B sr = insert_c1(fd, C1(transp, taga(sl))); + r = q_N(r) ? sr : C2(join, r, sr); + i += l; im += sia; + } + return r; + } +} diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 9286a99e..e65f9e2a 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -315,8 +315,7 @@ static NOINLINE B match_cells(bool ne, B w, B x, ur wr, ur xr, usz len) { } B shape_c1(B, B); -B transp_c1(B, B); -B insert_c1(Md1D* d, B x); +B fold_rows(Md1D* d, B x); // From fold.c B cell_c1(Md1D* d, B x) { B f = d->f; if (isAtm(x) || RNK(x)==0) { B r = c1(f, x); @@ -358,9 +357,8 @@ B cell_c1(Md1D* d, B x) { B f = d->f; Md1D* fd = c(Md1D,f); u8 rtid = fd->m1->flags-1; if (rtid==n_const) { f=fd->f; goto const_f; } - if ((rtid==n_fold || rtid==n_insert) && TI(x,elType)!=el_B && isPervasiveDy(fd->f) && RNK(x)==2 && SH(x)[1]==2) { - x = C1(transp, x); - return insert_c1(fd, x); + if ((rtid==n_fold || rtid==n_insert) && TI(x,elType)!=el_B && isPervasiveDy(fd->f) && RNK(x)==2 && SH(x)[1]<=64) { + return fold_rows(fd, x); } } } From 176152b445c9e759dbca6fdddb1e13d5aabcba4f Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 4 Mar 2023 14:28:22 -0500 Subject: [PATCH 2/3] =?UTF-8?q?Handle=20fold-cells=20on=20row=20length=201?= =?UTF-8?q?=20with=20=E2=8A=8F=CB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/md1.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index e65f9e2a..6501e2b6 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -357,8 +357,10 @@ B cell_c1(Md1D* d, B x) { B f = d->f; Md1D* fd = c(Md1D,f); u8 rtid = fd->m1->flags-1; if (rtid==n_const) { f=fd->f; goto const_f; } - if ((rtid==n_fold || rtid==n_insert) && TI(x,elType)!=el_B && isPervasiveDy(fd->f) && RNK(x)==2 && SH(x)[1]<=64) { - return fold_rows(fd, x); + if ((rtid==n_fold || rtid==n_insert) && TI(x,elType)!=el_B && isPervasiveDy(fd->f) && RNK(x)==2) { + usz n = SH(x)[1]; + if (n == 1) return select_cells(0, x, 2); + if (n <= 64) return fold_rows(fd, x); } } } From f4d2e26e5812567fe83477cd67a018f9af6a1c1d Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 4 Mar 2023 14:42:00 -0500 Subject: [PATCH 3/3] Don't do transposing fold unless height is greater than width --- src/builtins/md1.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 6501e2b6..f130b239 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -358,9 +358,9 @@ B cell_c1(Md1D* d, B x) { B f = d->f; u8 rtid = fd->m1->flags-1; if (rtid==n_const) { f=fd->f; goto const_f; } if ((rtid==n_fold || rtid==n_insert) && TI(x,elType)!=el_B && isPervasiveDy(fd->f) && RNK(x)==2) { - usz n = SH(x)[1]; - if (n == 1) return select_cells(0, x, 2); - if (n <= 64) return fold_rows(fd, x); + usz *sh = SH(x); usz m = sh[1]; + if (m == 1) return select_cells(0, x, 2); + if (m <= 64 && m < sh[0]) return fold_rows(fd, x); } } }