| IRC logs at
Set by AlexDaniel on 12 June 2018.
01:06 Geth left 02:03 frost-lab joined 07:10 domidumont joined
nwc10 good *, #moarvm 07:16
07:57 zakharyas joined
MasterDuke nine: here i assume you mean? 08:00
nine MasterDuke: yes, that block has 2 early returns 08:08
08:09 domidumont left
MasterDuke yeah, just glancing through it nothing sticks out as to why infix:<**> would exit early 08:10
the 'after' of infix:<**> isn't very big, though `Bytecode size: 1025 byte` is probably still too big to inline 08:14
jnthn Much too big 09:14
nwc10 such big | so uninlineable | bother 09:15
MasterDuke jnthn: have you seen ? 09:16
09:19 dogbert11 joined
jnthn Well, saw the description at least. Seems like it makes some cases faster and some cases slower? 09:19
MasterDuke yeah, positive exponents faster, negative ones slower (the positive case speedup decreases as the exponent increases though, since more time is spent in the actual pow_I, but i haven't confirmed if the converse is true for negative exponents) 09:21
09:21 dogbert17 left
jnthn Oh, but we're forcing a bunch of cases through Num that we weren't before 09:22
That seems like it'll change results
Or at least risk losing precision?
MasterDuke well, it passes a spectest 09:23
jnthn Still makes me a bit uneasy
nwc10 Num to do what operation? 09:24
jnthn I'm certainly not a numerics expert, but it feels risky just out of the fact that given n, 1 / n as a Rat can hold more precision than 1 / n as a double, because an entire double is 64 bits, but the denominator of the Rat is alone 64 bits 09:25
The significand of the double is only 53 bits 09:26
nwc10: See the change proposed in
nwc10 thanks
MasterDuke it just seems a little crazy that we're only using the Num return capability of pow_I to signal an error case 09:28
i'm certainly even less of a numerics expert, so please keep the comments/review/suggestions coming 09:31
jnthn Is it only ever used for error cases? 09:32
If you want to try and get it below the inline limit, extracting the error handling part is likely to be a win 09:33
MasterDuke currently, yes. pow_I returns a Num on (over/under)flow or when the exponent is negative 09:34
but right now we negate a negative exponent and then manually construct the Rat 09:35
ah, got the negative case slowdown to only ~3.1s 09:36
by using more nqp:: ops, but bytecode size is unchanged 09:37
jnthn Yeah, I think always passing a positive to pow_I is probably the right way to do this 09:38
nwc10 stuff in $other that I need to pay attention to
but I don't get that 1/ bit - it originates in commit 563abdd46845d70483a21180c817de516003309c
jnthn I do note that it checks b > 0 in two different places
In the original code
Which seems a bit wasteful too
09:38 linkable6 left
nwc10 oh, ah, yes I do 09:38
09:39 linkable6 joined
MasterDuke yeah, if we're going to always pass a positive exponent then i'd work to not do that twice 09:39
09:42 dogbert17 joined
MasterDuke might make sense to change the nqp op, can simplify the moarvm implementation then 09:42
until/unless we switch to gmp, and then additionally use their rationals 09:43
09:45 dogbert11 left 09:58 MasterDuke left, MasterDuke joined
MasterDuke jnthn: oh, back to inlining, why does spesh end up in instead of saying it can't inline infix:<**> because it's too big? 10:01
jnthn If it's in there, we haven't even figured out what we're calling 10:05
Which is a pre-requisite for inlining
There's two ways we can know what we're calling 10:06
MasterDuke i see messages about identity getting inlined *into* infix:<**>
jnthn 1. Statistically, a given static frame almost always shows up
2. We've proven that the code object is a constant
2 is always preferable because we don't need an extra guard 10:07
But 1 gets us inlining of things like closures where the code object is a closure clone, for example.
The code path you asked about happens when 2 is the case
MasterDuke there is a type specialization of infix:<**>: Callsite 0x7f3e2a886840 (2 args, 2 pos) ... Positional flags: obj, obj ... Which received 291 hits (100% of the 291 callsite hits) 10:08
heh, increases the bytecode size to 4358? 10:10
11:16 zakharyas left
MasterDuke pushed a newer commit to that speeds up both positive and negative exponents, but keeps the behavior of only passing positive exponents to pow_I 11:20
lizmat MasterDuke: did you try to not use \a \b but $a $b ? then you could lose the nqp::decont() s 11:30
MasterDuke i haven't 11:31
11:31 frost-lab left
lizmat also: perhaps put the branch into a separate sub / R:Internals method reducing the bytecode size of the infix:<**> code itself 11:31
MasterDuke i tried that 1.5 versions ago and it didn't make a difference 11:32
lizmat or at least put it's .new outside of the condition
MasterDuke but, i also noticed bytecode size changed with the moarvm alway-log-deconts commit reverted
lizmat anyways, that would be things I would try 11:33
MasterDuke and since i'm not entirely sure what's going to happen with that commit, wasn't too worried about bytecode size, since it's currently *way* above the inline limit 11:34
lizmat also: did you consider splitting code paths completely on b being >= 0 ? 11:36
MasterDuke 5th version that does that just about to be pushed
pushed 11:37
bunch of different versions in now, tldr; can keep original behavior wrt negative exponents and still be faster for both positive and negative exponents, but (still) nowhere near small enough to inline 11:51
11:52 domidumont joined
lizmat and another Rakudo Weekly News hits the Net: 12:52
12:56 zakharyas joined
MasterDuke neither NQP nor Rakudo ever use nqp::pow_I for the Num value (i.e., they only over pass in positive exponents), other than to signify overflow. what about changing its implementation to expect positive exponents and instead return just an Int type object on overflow? then all the nqp::istype($foo, Num) could instead be !nqp::isconcrete($foo) and 14:25
MoarVM's MVM_bigint_pow could be simplified
greppable6: nqp::pow_I
greppable6 MasterDuke, 1 line, 1 module:
MasterDuke only positive values used there ^^^ 14:28
jnthn Are there not different kinds of error that it singals with nan/+inf/-inf? 14:29
MasterDuke yeah. but we never use them and instead figure out in rakudo 14:30
all rakudo ever checks for is istype(Num) 14:32
MVM_bigint_pow returns -inf or +inf, but not nan 14:34
and for negative exponents we just use pow(), libtommath doesn't support them 14:36
jnthn Ah, but we can recreate whether it's +inf or -inf back in Raku land anyway... 15:11
Yeah, then the simplification seems reasonable to me
MasterDuke cool. not entirely sure how much it will speed things up, but i don't think it will be a terribly time consuming experiment to try 15:13
jnthn Even if it doesn't, it's a nice simplification? 15:17
MasterDuke hopefully. simplification in the other direction would be pow_I to return a Failure with the appropriate Exception inside, but i don't think we can do that, right? 15:19
arg, bootstrapping in nqp bites again 15:48
lizmat Failure, I'd say no
but throwing an exception and catching that with nqp::handle maybe ? 15:49
MasterDuke but is that going to be any faster than the current checking done in rakudo?
jnthn isconcrete is a pretty cheap check 15:57
We could also maybe stick logging on the pow_I op so that we log its result and then can do guard and maybe toss out the error branch if we rarely hit 15:58
That could get it below the inline size
MasterDuke btw, returning a type object is just `return MVM_repr_alloc_init(tc, int_type);`, correct? 15:59
jnthn No, it's just `return int_type->st->WHAT;` 16:02
MasterDuke thanks 16:03
cog /join #typescript 16:24
16:27 zakharyas left
lizmat cog: you traitor, you! :-) 16:40
jnthn I suspect a lot of the things typescript is commonly used for (web frontend) are things you simply can't use Raku for today. :) 16:48
nine I guess we can let this one slide....for now :D 16:49
lizmat actually, it appears that documentable is actually using coffescript 16:51
dinner& 16:55
sena_kun lizmat, it does because we have no normal code highlighters available other than this one. :S 16:57
18:10 domidumont left 19:15 MasterDuke left, MasterDuke joined
cog lizmat, if we want to succeed, we must do like Python and connect to the rest of the world. Here I attempt to write a raku parse tree browser using svelte. 19:28
lizmat ++cog 19:29
cog Too bad the best minds are too busy with optimising raku and MoarVM for lack of manpower 19:31
Speaking of connecting to the rest of the world, the jnthn++ talk mentioned in your weekly seems promising. 19:33
lizmat yes, it is! 19:34
cog I hope some day someone will port the grammar engine to wasm. It could be a success independent of raku like PCRE independent of Perl. 19:43
19:44 zakharyas joined
cog Speaking of connecting I just discovered an old and probably well known Eric Raymond article on why he dropped Perl. Like him about the same time, I wrote some code using Perl and TCL/TK for the front end. It was not pretty. 19:52
lizmat where has the time gone :-) 19:55
nwc10 MasterDuke perhaps some code to run through the various checkers:
$ r 'my %h = "a" .. "e" Z=> 1..5; for %h.keys { %h{$_~$_} = 42 }'
concatenate requires a concrete string, but got null
does so in about 1 in 10 times for me
MasterDuke dogbert17 is also great at this 19:56
cog In the mean time some guy also realised the Perl limitations and threw mugs at a wall. Hopefully not at Larry Wall.
lizmat no BDFLs where hurt in that incident :-) 19:59
cog Sveltes has a raku slang mindset. Messing with CSS, Dom and typescript/js slangs to create components. 20:00
dogbert17 lizmat, MasterDuke: you called :) 20:16
lizmat conclusion? 20:17
dogbert17 good question, the valgrind error only show up when something goes wrong, but why it wants to print this error is still a myster (to me) 20:20
*mystery 20:21
MasterDuke arg. i misspell 'nqp' as 'npq' and get `Cannot find method 'package_at_key' on 'BOOTHash': no method cache and no .^find_method` which is of no help. i'd be a fan of specially casing that error 20:28
lizmat same for nap ? 20:29
that's a common error I make
m: nap:say("foo")
camelia 5===SORRY!5=== Error while compiling <tmp>
Undeclared routine:
nap:say<foo> used at line 1
lizmat but the error at least is less LTA
MasterDuke m: nap::say("foo") 20:30
camelia Could not find symbol '&say' in 'GLOBAL::nap'
in block <unit> at <tmp> line 1
MasterDuke nqp: nap::say("foo")
camelia Cannot invoke this object (REPR: P6opaque; NQPMu)
at <tmp>:1 (<ephemeral file>:<mainline>)
from gen/moar/stage2/NQPHLL.nqp:1946 (/home/camelia/rakudo-m-inst-2/share/nqp/lib/NQPHLL.moarvm:eval)
from gen/moar/stage2/NQPHLL.nqp:2151 (/home/camelia/rak…
MasterDuke nqp: npq::say("foo")
camelia Cannot invoke this object (REPR: P6opaque; NQPMu)
at <tmp>:1 (<ephemeral file>:<mainline>)
from gen/moar/stage2/NQPHLL.nqp:1946 (/home/camelia/rakudo-m-inst-2/share/nqp/lib/NQPHLL.moarvm:eval)
from gen/moar/stage2/NQPHLL.nqp:2151 (/home/camelia/rak…
lizmat I guess about the same in nqp :-)
MasterDuke i get the error i copied when compiling rakudo 20:31
dogbert17 lizmat: the fact that you're changing the hash while iterating its keys, couldn't that be problematic? 20:37
lizmat well, yes, that may be the case...
but it was my understanding that nwc10 had fixed any breakage in the iterator, when keys are added 20:38
if that understanding is wrong, then I guess it's a case of DIHWIDT
dogbert17 try this variant a couple of times my %h = "a" .. "e" Z=> 1..5; for %h.keys { say $_; %h{$_~$_} = 42 }; say %h 20:39
lizmat or otherwise, maybe we should make .keys on Associative be eager by default, then served by a lazy iterator
wow, ASSIGN-POS appearing as name ??
dogbert17 I got BIND-KEY once 20:40
lizmat keys.eager never fails, right ? 20:41
so that is at least a workaround
dogbert17 perhaps we should check with nwc10 20:42
but yes eager works
MasterDuke there are a couple combinations of options wrt infix:<**> and pow_I: just change how overflows are reported, disallow negative exponents, special case certain values in moarvm, special case certain values in rakudo 20:45
the benefit to special casing certain values (e.g., 0, 1, 2) in rakudo is that you can skip most to all of the error handing required for pow_I. the downside is infix:<**> will get bigger 20:48
the benefit to special casing certain values (e.g., 0, 1, 2) in moarvm is that you can skip some of the overhead of actually calling the libtommath function. the downside is that for every call to pow_I you pay the cost of the extra conditionals 20:51
interestingly, the libtommath function has no special casing itself, but the gmp function does (there is still some benefit to doing the special casing in moarvm before calling the gmp function, just less so than for libtommath) 20:55
21:00 zakharyas left 21:21 dogbert11 joined 21:25 dogbert17 left 22:03 dogbert11 left 22:11 dogbert11 joined 22:18 dogbert11 left, dogbert11 joined 22:28 dogbert11 left 22:29 dogbert11 joined 22:36 dogbert17 joined 22:38 dogbert11 left 22:40 dogbert11 joined 22:43 dogbert17 left, dogbert17 joined 22:46 dogbert11 left 22:57 dogbert17 left 22:58 dogbert17 joined 23:52 MasterDuke left