warn slow for unknown scans & folds & ⍋

This commit is contained in:
dzaima 2021-09-26 00:18:38 +03:00
parent 2ddfc43682
commit 797a848ed4
8 changed files with 33 additions and 8 deletions

View File

@ -2,7 +2,10 @@
#include "../utils/each.h"
#include <math.h>
#define P2(N) { if(isArr(w)|isArr(x)) return arith_recd(N##_c2, w, x); }
#define P2(N) { if(isArr(w)|isArr(x)) { \
SLOWIF((!isArr(w) || TI(w,elType)!=el_B) && (!isArr(x) || TI(x,elType)!=el_B)) SLOW2("arithd " #N, w, x); \
return arith_recd(N##_c2, w, x); \
}}
#if TYPED_ARITH
#define GC2f(SYMB, NAME, EXPR, EXTRA) B NAME##_c2(B t, B w, B x) { \
if (isF64(w) & isF64(x)) return m_f64(EXPR); \

View File

@ -2,7 +2,10 @@
#include "../utils/each.h"
#include <math.h>
#define P2(N) { if(isArr(w)|isArr(x)) return arith_recd(N##_c2, w, x); }
#define P2(N) { if (isArr(w)|isArr(x)) { \
SLOWIF((!isArr(w) || TI(w,elType)!=el_B) && (!isArr(x) || TI(x,elType)!=el_B)) SLOW2("cmp " #N, w, x); \
return arith_recd(N##_c2, w, x); \
}}
#define AL(X) i8* rp; B r = m_i8arrc(&rp, X);

View File

@ -72,6 +72,7 @@ B GRADE_CAT(c1)(B t, B x) {
return r;
}
SLOW1(GRADE_UD("","")"𝕩", x);
TALLOC(BI32p, tmp, ia);
SGetU(x)
for (usz i = 0; i < ia; i++) {
@ -124,6 +125,7 @@ B GRADE_CAT(c2)(B t, B w, B x) {
}
} else {
SGetU(x)
SLOW2("𝕨"GRADE_UD("","")"𝕩", w, x);
B* wp = arr_bptr(w);
if (wp==NULL) {
HArr* a = toHArr(w);

View File

@ -118,6 +118,7 @@ B scan_c1(Md1D* d, B x) { B f = d->f;
}
}
base:;
SLOW2("𝕎`𝕩", f, x);
bool reuse = v(x)->type==t_harr && reusable(x);
usz i = 0;
@ -161,6 +162,8 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f;
}
}
base:;
SLOW3("𝕨 F` 𝕩", w, x, f);
bool reuse = (v(x)->type==t_harr && reusable(x)) | !ia;
usz i = 0;
HArr_p r = reuse? harr_parts(REUSE(x)) : m_harrs(a(x)->ia, &i);
@ -198,7 +201,7 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
u8 xe = TI(x,elType);
if (isFun(f) && v(f)->flags && xe<=el_f64) {
u8 rtid = v(f)->flags-1;
if (rtid==0) { // +
if (rtid==0) { // +
if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; i<ia; i++) c+= xp[i]; dec(x); return m_f64(c); } // won't worry about 64TB array sum float inaccuracy for now
if (xe==el_i16) { i16* xp = i16any_ptr(x); i32 c=0; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
if (xe==el_i32) { i32* xp = i32any_ptr(x); i32 c=0; for (usz i=0; i<ia; i++) if (addOn(c,xp[i]))goto base; dec(x); return m_i32(c); }
@ -227,6 +230,7 @@ B fold_c1(Md1D* d, B x) { B f = d->f;
}
}
base:;
SLOW2("𝕎´ 𝕩", f, x);
SGet(x)
BBB2B fc2 = c2fn(f);
@ -276,6 +280,7 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f;
}
}
base:;
SLOW3("𝕨 F´ 𝕩", w, x, f);
B c = w;
SGet(x)

View File

@ -1008,7 +1008,7 @@ B select_ucw(B t, B o, B w, B x) {
for (i64 i = 0; i < xia; i++) set[i] = false;
#define EQ(F) if (set[cw] && (F)) thrM("𝔽⌾(a⊸⊏): Incompatible result elements"); set[cw] = true;
#define FREE_CHECK TFREE(set)
SLOWIF(xia>100 && wia<xia/10) SLOW2("⌾(𝕨⊸⊏)𝕩 because CHECK_VALID", w, x);
SLOWIF(xia>100 && wia<xia/20) SLOW2("⌾(𝕨⊸⊏)𝕩 because CHECK_VALID", w, x);
#else
#define EQ(F)
#define FREE_CHECK
@ -1017,7 +1017,7 @@ B select_ucw(B t, B o, B w, B x) {
u8 we = TI(w,elType);
u8 xe = TI(x,elType);
u8 re = TI(rep,elType);
SLOWIF(!reusable(x) && xia>100 && wia<xia/10) SLOW2("⌾(𝕨⊸⊏)𝕩 because not reusable", w, x);
SLOWIF(!reusable(x) && xia>100 && wia<xia/50) SLOW2("⌾(𝕨⊸⊏)𝕩 because not reusable", w, x);
if (we<=el_i32) {
w = toI32Any(w);
i32* wp = i32any_ptr(w);

View File

@ -734,7 +734,11 @@ NOINLINE void printAllocStats() {
BBB2B ptr;
static void warn_ln(B x) {
if (isArr(x)) print_fmt("%s items, %S, shape=%H\n", a(x)->ia, eltype_repr(TI(x,elType)), x);
else printf("not array\n");
else {
printf("atom: ");
printRaw(x = bqn_fmt(inc(x))); dec(x);
putchar('\n');
}
}
void warn_slow1(char* s, B x) {
if (isArr(x) && a(x)->ia<100) return;
@ -745,4 +749,10 @@ NOINLINE void printAllocStats() {
printf("slow %s:\n 𝕨: ", s); warn_ln(w);
printf(" 𝕩: "); warn_ln(x);
}
void warn_slow3(char* s, B w, B x, B y) {
if ((isArr(w)||isArr(x)) && (!isArr(x) || a(x)->ia<50) && (!isArr(x) || a(x)->ia<50)) return;
printf("slow %s:\n 𝕨: ", s); warn_ln(w);
printf(" 𝕩: "); warn_ln(x);
printf(" f: "); warn_ln(y);
}
#endif

View File

@ -250,12 +250,15 @@ typedef struct Arr {
#if WARN_SLOW==1
void warn_slow1(char* s, B x);
void warn_slow2(char* s, B w, B x);
void warn_slow3(char* s, B w, B x, B y);
#define SLOW1(S, X) warn_slow1(S, X)
#define SLOW2(S, W, X) warn_slow2(S, W, X)
#define SLOW3(S, W, X, Y) warn_slow3(S, W, X, Y)
#define SLOWIF(C) if(C)
#else
#define SLOW1(S, X)
#define SLOW2(S, W,X)
#define SLOW2(S, W, X)
#define SLOW3(S, W, X, Y)
#define SLOWIF(C)
#endif

View File

@ -152,7 +152,6 @@ static B eachd(B f, B w, B x) { // complete w F¨ x without fills
#if CATCH_ERRORS
static inline B arith_recd(BBB2B f, B w, B x) {
SLOWIF((!isArr(w) || TI(w,elType)!=el_B) && (!isArr(x) || TI(x,elType)!=el_B)) SLOW2("arith", w, x);
B fx = getFillQ(x);
if (noFill(fx)) return eachd_fn(f, bi_N, w, x);
B fw = getFillQ(w);